探索アプローチでも解けるし、整数論的考察で解くこともできる。
問題概要
の倍数であって正の整数であるものをいくつか用意する。
その総和を で割った余りが となることはありうるか?
制約
考えたこと
まず、「いくつかの正の の倍数を足す」とあるが、 の倍数同士を足しても結局 の倍数であることに注意しよう。よって、問題は次のように言い換えられる。
の倍数を で割って 余ることはありうるか?
この問題へのアプローチはいくつか考えられる。
- 探索解法
- 整数論的考察
1. 探索解法
まず探索解法で解いてみる。基本的には、すべての の倍数を で割るのを試せばよいが、 の倍数は無限にあるので、実際にはすべての の倍数を試すことはできない。
そこで、次のことに着目しよう。実は、正の の倍数として最初の 個 ( ) だけ試せば良いのだ。なぜならば、一般に
が成立するからだ。つまり、 を で割った余りは、周期 で同じことを繰り返すのだ。
よって、 を で割った余りの中に が含まれるかどうかを判定すればよい。
#include <bits/stdc++.h> using namespace std; int main() { int A, B, C; cin >> A >> B >> C; bool res = false; for (int a = A; a <= A * B; a += A) { if (a % B == C) res = true; } cout << (res ? "YES" : "NO") << endl; }
2. 整数論的考察
の倍数を で割った余りが になりうるかどうかは、
を満たす整数 が存在するかどうかを判定する問題であると言える。
これを変形して、
これを満たす整数 が存在する条件は、次のように書ける。
#include <bits/stdc++.h> using namespace std; int main() { int A, B, C; cin >> A >> B >> C; cout << (C % gcd(A, B) == 0 ? "YES" : "NO") << endl; }