本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目链接:
codeforces.com/problemset/…
给定a,b,x三个数,可以执行无限次操作,问过程中是否会出现x 操作一: 操作二:
例子以(35,14)为例,箭头上的标注是对谁做改变,保证
因为是可以对任意一个数进行改变,而且后面的变换还会循环到前面的状态。所以时刻保证,可以发现,当只进行操作时,可以保证每一个数都出现。
所以时刻保证,一直进行操作
但是由于a的值很大,过程中会超时。当a很大的时候,a相当于一直进行减b的操作,变成的过程中看是否出现x。这个过程使用余数的数学技巧,如果则代表出现过x,没有出现则a直接变成
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
void solve()
{
ll a,b,x;
cin>>a>>b>>x;
while(a && b)
{
if(a < b) swap(a,b);
if(a % b == x % b && x <= a)
{
cout<<"YES\n";
return;
}
a %= b;
}
cout<<"NO\n";
}
int main()
{
int t;
// t = 1;
cin>>t;
while(t--) solve();
return 0;
}