https://yukicoder.me/problems/no/982
解説
https://yukicoder.me/submissions/428751
A=1、または、B=1の場合は全部作れるので、0となる。
2≦gcd(A,B)の場合は、作る数は全てその倍数になるので、無限に作れない数があり、-1。
それ以外のパターンを考えるのだが、★2で制約もゆるいので、雑に扱えるんじゃないかという仮定がある。
互いに素であるため、大きい数を作る時は微妙に配合を変えることで、作れそうな感じがする。
なので、小さい数に対して作れない数がある。
よって、小さい数に対して作れるかどうかを判定してやればいい。
小さい数は104くらいまでの数に対して判定した。
判定方法は、xをある程度のサイズまで試して、NからAxを引いたときに余りがBで割り切れるかを見ればいい。
int A, B; //--------------------------------------------------------------------------------------------------- int solve() { if (A == 1 || B == 1) return 0; int g = gcd(A, B); if (g != 1) return -1; int ans = 0; rep(N, 1, 10101) { bool ng = true; rep(x, 0, 1010) if (0 <= (N - A * x) && (N - A * x) % B == 0) ng = false; if (ng) ans++; } return ans; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> A >> B; cout << solve() << endl; }