TechFUL: Techちゃんとバウムクーヘン泥棒【easy】

問題概要

Techちゃんは好みの男の子にバウムクーヘンを作りたい.

Techちゃんは  x 個入りのバウムクーヘンを好きな個数だけ自由に作る.

しかし、バウムクーヘンの個数が  m 個以上のとき、 m 個未満になるまでカラスの集団が  m 個ずつ食べてしまう.

男の子は  r \; (\lt m) 個のバウムクーヘンを貰うと Tech ちゃんを好きになる.

男の子が Tech ちゃんを好きにさせることが可能か判定せよ.

問題のリンク

制約

  •  1 \leq x, m \leq 10^{18}
  •  0 \leq r \lt m

解法

Tech ちゃんが  xp \; (p \geq 0) 個のバウムクーヘンを作り、

カラスが  mq \; (q \geq 0)バウムクーヘンを食べたとする.

このとき、 xp = mq + r が成り立つ.

これを式変形すると、 xp - mq = r という一次不定方程式になる.

この方程式が整数解を持つための必要十分条件は r が gcd(x, m) の倍数を満たすことである.

一次不定方程式については以下の drken さんの記事が参考になる.

qiita.com

この方程式の整数解がどちらも 0 以上になるかを考える.

 p, q xp - mq = r を満たす整数解の一つとする.

また、 p', q' xp' = mq' となる整数とすると、 x, m > 0 より  p', q' は同符号である.

 x(p+p') - m(q+q') = r となるため、 p+p', q+q' も一次不定方程式の整数解となる.

 p', q' を十分大きな値にすれば、 p+p', q+q' はどちらも  0 以上の整数にすることができる.

よって、 xp - mq = r には  0 以上の整数解  p, q が存在する.

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long x, m, r;
    cin >> x >> m >> r;
    cout << (r % gcd(x, m) == 0 ? "Yes" : "No") << endl;
}