回答編集履歴
1
コード追記
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`くらいだと時間かかりますね…
|