AtCoder, ABC060: B. Choose Integers
まず問題文を読むと,「整数をいくつ選んでもよい」とある.
じゃあめんどくさいし1つだけ選ぶことにしましょう.
(2つ以上選んでも最終的には1つ選んだ場合の問題に帰着できる)
選んだ数を としてみましょう.
このとき, は の倍数です.
このため, は を用いて,
と表せます.この の定義を 式1 とします.
問題文の条件が満たされるかどうかはこの が と を法として合同かどうかをチェックすればよいです.
次に, を で割った数の取りうる値について考えます.
そのために,まずは の最小値,最大値を考えてみます.
の取りうる数からなる数列を とすると, は
と表せます.
の要素を で割ったあまりは,数列を として
となります.
この数列の最大値は を より小さい整数として, です.
なぜなら, が に等しいなら であり,
のときは だからです.
つまり, のはじめの 個の要素が で割った時に に等しくなるかどうかを確かめればよいということです.
雑に考えるとエイっとそれっぽいコードがかけそうだけど,ちゃんと自然言語で説明すると意外と難しい...?となった問題でした.
コードは↓です.
#include <iostream> # define rep(i, n) for (int i = 0; i < (int)(n); i++) using namespace std; int main() { long long a, b, c; cin >> a >> b >> c; string ans = "NO"; rep (i, a*b) { if (i*a % b == c) { ans = "YES"; break; } } cout << ans << endl; return 0; }