我们知道:
gcd(a,b) ==
if(a == b) return a;
return (a > b) ? gcd(a-b,b) : gcd(a,b-a);
这个过程可以优化成
gcd(a,b) == (b == 0) ? a : gcd(b,a%b);
这是因为在第一种方法中,a - b,a - 2b,a - 3b,…a - kb,
在最后其实a就变成了a % b。
而我们如果要求a - kb 是否可以等于 x 其实就是求
(a - x) % b == 0 -> a % b == x % b 。 a和x的模数相同时,才有可能a - kb == x
当然 x <= a。
即我们可以将这样的过程
void solve()
{
ll x, y, k;cin>>x>>y>>k;
if(x>y) swap(x, y);
while(x)
{
if(x == k || y == k) {cout<<"YES\n"; return;}
y -= x;
if(x>y) swap(x, y);
}
cout<<"NO\n";
}
优化为:
void solve()
{
ll x, y, k;cin>>x>>y>>k;
if(x>y) swap(x, y);
while(x)
{
if(k%x == y%x && k<=y) {cout<<"YES\n"; return;}
y %= x;
if(x>y) swap(x, y);
}
cout<<"NO\n";
}
练习题:Problem - D - Codeforces (Unofficial mirror site, accelerated for Chinese users)
题解:(34条消息) Educational Codeforces Round 117 (Rated for Div. 2) D. X-Magic Pair_JXNU_SONG的博客-CSDN博客
Educational Codeforces Round 117 (Rated for Div. 2) A~E - 知乎 (zhihu.com)