「この数からこの数の間の数はすべて作れる」という考え方をする問題。この考え方は、より高度な問題では頻出!
問題概要
1〜6 の目が出るサイコロを 回振った。
出た目の総和が になることがありうるかどうかを判定せよ。
解法
これは難しい!!!
こういう時には、「出た目の総和が にできない場合ってどんな場合だろう......」と考えてみると、活路が開けることが多い。
たとえば、、 の場合はあり得ない。なぜなら、3 回の目の和として考えられる最大値は
であり、それを超過しているからだ。また、、 の場合もあり得ない。なぜなら、3 回の目の和として考えられる最小値は
であり、それよりも小さいからだ。
一般に、 回ふって出た目の和の最小値は 、最大値は になるから、次のことが言える。
でなければならない
と の間はすべて作れること
では、この と の間の数はすべて作れるだろうか? この答えは Yes だ!!!!!
考えやすくするため、 個のアメを 人に配るという設定にして考えてみよう。ただし、1 人のもらう個数は 1〜6 個のいずれかでなければならないとしよう。
たとえば 、 という場合を考えてみよう。
あまり 2
であることに注意しよう。
よって、14 個のアメをまず 3 人に 4 個ずつ配り、そして残った 2 個を 2 人に配れば良い。つまり、
となる。、 の場合はこうして実現できた。
他に、一般に、 さえ満たしていれば、同様の方法で実現できる。
まとめ
以上から、次の条件を満たせば "Yes"、そうでなければ "No" だ。
コード
#include <bits/stdc++.h> using namespace std; int main() { int A, B; cin >> A >> B; int min_value = A; int max_value = 6 * A; if (min_value <= B && B <= max_value) cout << "Yes" << endl; else cout << "No" << endl; }