色んな解法がある! この手の数値的なものに対して「全探索」という解法を選択肢に持てるようにしていこう。
問題概要
3 個の正の整数 が与えられる。次の条件を満たす整数が存在するかどうかを判定せよ。
- の倍数である
- 以上 以下である
制約
解法 (1):for
文で全探索
以上 以下の整数の個数は である。ここで、制約として とあるので、たかだか 1000 通り程度しか候補がないことがわかる。
よって、全部調べても計算時間に余裕がある (このような計算時間に関する判断は、より上級の問題では常に必要になる)。
for
文を用いて、 について、それぞれ の倍数であるかどうかを判定すればよい。そして、 の倍数が存在すれば "Yes" と答えればよい。
#include <bits/stdc++.h> using namespace std; int main() { int K, A, B; cin >> K >> A >> B; bool exist = false; for (int x = A; x <= B; ++x) { if (x % K == 0) exist = true; } if (exist) cout << "OK" << endl; else cout << "NG" << endl; }
解法 (2):個数を求める
もう一つの方法は、次の定理を使うものだ!
以上 以下の整数のうち、 の倍数は N / K
個ある ( を で割ったときの商)
これは、数学 IA でたびたび登場する概念だ。不安な方は数学 IA の「集合と命題」「場合の数」「整数・数学と人間の活動」といった単元を復習すると安心できると思う。
さて、そうすると次のように整理できる。
- 以下の の倍数の個数は
B / K
個である - 未満の の倍数の個数は
(A - 1) / K
個である ( 未満と 以下は同じです)
よって、 以上 以下の整数の個数は、次のように求められる!!
B / K - (A - 1) / K
あとは、この値が 1 以上であるかどうかを判定すれば OK!!
#include <bits/stdc++.h> using namespace std; int main() { int K, A, B; cin >> K >> A >> B; int num = B / K - (A - 1) / K; if (num >= 1) cout << "OK" << endl; else cout << "NG" << endl; }