回答編集履歴

1

補足を追加

2020/11/09 03:04

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -11,3 +11,51 @@
11
11
 
12
12
 
13
13
  なら、合計が`x`になる組み合わせ`a, b, c`を一組見つけたことになるから。
14
+
15
+
16
+
17
+ 補足:
18
+
19
+ > 1 から n までの数の中から、重複無しで3つの数を選びそれらの合計が x となる組み合わせの数
20
+
21
+
22
+
23
+ 1からnまでの整数(問題文には明示されていないが、続く文章や例から確実)から3つの数を重複無く選ぶということは、
24
+
25
+
26
+
27
+ - 3つの整数はそれぞれ異なるので、大小関係が成り立つ
28
+
29
+
30
+
31
+ ということです。そこで、解法を提示しているブログでは、
32
+
33
+
34
+
35
+ - 3つの重複しない整数をそれぞれ`a`, `b`, `c`とする
36
+
37
+ - **便宜的に**、`a < b < c`の関係が成り立つとする
38
+
39
+
40
+
41
+ としています。つまり、3つの整数のうち、一番小さなものを`a`、二番目に小さなものを`b`、三番目に小さなものを`c`として扱います。
42
+
43
+
44
+
45
+ すると、`a`は「少なくとも合計値`x`の三分の一よりは小さい」ことが必要です。なぜなら、`a`と、それより大きな`b`や`c`との合計が`x`にならないといけないからです(重複を許せば、合計値`x`の三分の一が`a`の上限となります)。
46
+
47
+
48
+
49
+ `b`の値は、`a`の値より大きいことが必要で、なおかつ「合計値`x`から`a`の値を引いた数の二分の一より小さい」ことも必要です。なぜなら、`b`と、それより大きな`c`との合計が、「合計値`x`から`a`の値を引いた数」にならないといけないからです(重複を許せば、合計値`x`から`a`の値を引いた数の二分の一が`b`の上限となります)。
50
+
51
+
52
+
53
+ `c`の値は、「合計値`x`から`a`の値と`b`の値を引いた数」で求められますが、これは`b`より大きいことが必要で、なおかつ`n`以下である必要があります。
54
+
55
+
56
+
57
+ 以上を効率よく探すために、`range`で整数の範囲を指定し、条件に当てはまるときに(初期値0の)`cnt`を1増やせば、最終的な組み合わせの数が得られます。
58
+
59
+
60
+
61
+ `cnt += 1`の直後の行に、同じだけインデント(字下げ)した`print(f"{a} {b} {c}")`を追加してみれば、見つかった組み合わせが表示されるので、理解が深まるでしょう。