質問するログイン新規登録

回答編集履歴

1

コード追記

2018/01/23 09:22

投稿

8524ba23
8524ba23

スコア38350

answer CHANGED
@@ -13,4 +13,17 @@
13
13
  また、重複なしの3つの数を`s1`,`s2`,`s3`とすると、その取り出す順番は不問なので`s1 > s2 > s3`という条件を設けることができます。これらの条件により、ループ範囲の削減と重複チェックそのものが不要になります。
14
14
 
15
15
  最後に。
16
- ある`s1`と`s2`が決まった場合、`s1+s2+s3=x`を満たす`s3`は1つに決まるので…
16
+ ある`s1`と`s2`が決まった場合、`s1+s2+s3=x`を満たす`s3`は1つに決まるので…
17
+ ```Python
18
+ def gen_ans1(n,x):
19
+ for s1 in reversed(range( 3, n+1)):
20
+ for s2 in reversed(range( 2, s1)):
21
+ s3 = x - (s1 + s2)
22
+ if s3 >= 1 and s3 < s2: # 制約条件
23
+ yield (s1,s2,s3)
24
+
25
+ for (n,x) in [(5,9),(100,123),(1000,1234),(10000,12345)]:
26
+ ret = list(gen_ans1(n,x))
27
+ print(n,x,len(ret))
28
+ ```
29
+ さすがに`n=10000`くらいだと時間かかりますね…