4. ?AtCoder Inc. All rights reserved. 4
A問題 問題概要
? 2 つの整数 S,T が与えられます。
? S 以上 T 以下の整数の個数を計算してください。
? 1 ≦ S ≦ T ≦ 1,000
5. ?AtCoder Inc. All rights reserved. 5
A問題 入出力
? 標準入力から 2 つの整数を読み込んで、答えを計
算して、1 つの整数を出力してください。
? 出力の末尾には改行を入れてください(改行コード
の種類に注意すること)。
? 標準入出力の使い方等に関しては、過去の ABC
解説や練習ページに詳しい説明があります。
? 練習ページ: http://practice.contest.atcoder.jp/
6. ?AtCoder Inc. All rights reserved. 6
A問題 計算
? S 以上 T 以下の整数は、S に 1 つずつ数を足して
いって、T に等しくなるまでに足した回数に 1 を加
えた値 (S 自身) が答えとなります。
? 1 つずつ数え上げなくても、T-S+1 という式を計算
することでも求めることができます。
7. ?AtCoder Inc. All rights reserved. 7
A問題 計算の補足
? 前者のアルゴリズムは O(T-S)、後者のアルゴリズ
ムは O(1) ということができます。
? このような計算量の考え方は、アルゴリズムの設計
において役に立つことがあるので、余裕があれば
是非とも習得してください。
? 今回の問題ではどちらの方針でも解くことができま
す。
18. ?AtCoder Inc. All rights reserved. 18
C問題 問題概要
? N 枚のコインを無作為に一列に並べます。
? 左端から順に、そのコインよりも右側にある、そのコ
インに書かれた数の倍数が書かれたコインをすべ
てひっくり返す動作をします。
? 最終的に表を向いている(偶数回反転した)コインの
枚数の期待値を計算してください。
? 1 ≦ N ≦ 100
19. ?AtCoder Inc. All rights reserved. 19
C問題 浮動小数点について
? この問題では浮動小数点が出てきます。
? 文字列同様、浮動小数点の扱いにも慣れておきま
しょう。
? 整数型と浮動小数点型間の移行などの際には注
意してください。
20. ?AtCoder Inc. All rights reserved. 20
C問題 解法その 1
? N ! 通り全てを試す方法(総当たりによる99点解法
? 順列の全探索には、幾つか数え方があります。
? C++, Pythonにおけるnext_permutation
? 配列を予め入れておいて、do-whileで回し
てあげると、自動的に順列が取り出せる
? 深さ優先探索などでも簡単にかける。
? 使った数字を記録しながらN回再帰する
21. ?AtCoder Inc. All rights reserved. 21
C問題 解法その 1
? N ! 通りのすべての組み合わせを作り、実際に実験
してみようと考えます。
? N ≦ 8 であれば、計算量が O(N!) でも大丈夫なこ
とが多いです(今回も、この方針で 99 点を得ること
ができます)。
? 残り 1 点を得るには N ≦ 100 の制約に対処する
必要があります。
22. ?AtCoder Inc. All rights reserved. 22
C問題 解法その 1
? もしも、N ! 通りのすべての組み合わせを N=100 に
おいて計算しようとなると、それにはとてつもない時
間がかかることになります(2 sec の時間制限は大
幅に超えてしまう)。
? より高速に動作するアルゴリズムを設計する必要
があります。
23. ?AtCoder Inc. All rights reserved. 23
C問題 数学の時間
? 期待値の性質を用いることで高速に解くためのア
プローチが得られます。
? 求める期待値は、すべての組み合わせのうちそれ
ぞれにおいて表を向いているコインの枚数の総合
計を N! で割ったものとして計算できます。
? コインの枚数の総合計について考えます。
24. ?AtCoder Inc. All rights reserved. 24
C問題 数学の時間
? コインの枚数の総合計は、組み合わせごとに区
切って数えても、各コインが全組み合わせのうち何
通りの組み合わせで表を向くのかという数え方で数
えても一致します。よって、それぞれのコインにつ
いて、そのコインが、何通りの並べ方で表を向くの
かという方針で計算することにします。
25. ?AtCoder Inc. All rights reserved. 25
C問題 数学の時間(補足)
? 補足として、全体を足しあわせてから N! で割った
結果と、それぞれの要素を N! で割ったものの合計
は等しくなります。
? それぞれのコインごとに、表を向いている組み合わ
せ数を N! で割った値は、そのコインが表を向いた
状態で終了する確率に等しくなります。
? 今回の場合、この確率の足し合わせが期待値にな
ります。
26. ?AtCoder Inc. All rights reserved. 26
C問題 解法その 2
? あるコインについて、このコインに書かれた数を C
としたとき、どのような条件を満たせばこのコインが
最終的に表を向いているかを考えます。
? このコインよりも左側にあるコインに書かれた数の
うち、C の約数となっているものの枚数が奇数枚な
ら裏、偶数枚なら表となります。
27. ?AtCoder Inc. All rights reserved. 27
C問題 解法その 2
? 全コインのうち、目標のコインと、それ以外の中で C の約数
となっているコイン(S 枚あるとする)の並びについて考えま
す。
約
数
約
数
目
標
約
数
他 他
28. ?AtCoder Inc. All rights reserved. 28
C問題 解法その 2
? 全コインのうち、目標のコインと、それ以外の中で C の約数
となっているコイン(S 枚あるとする)の並びについて考えま
す。
? C の約数でないコインの並びは関係なく、純粋に目標のコ
インより左に何個 C の約数があるかを考えます。
約
数
約
数
目
標
約
数
他 他