【数论】【思维】D. X-Magic Pair

186 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目链接:
codeforces.com/problemset/…

给定a,b,x三个数,可以执行无限次操作,问过程中是否会出现x 操作一:d=ab,(a,b)>(d,b)d = |a - b|, (a, b) -> (d, b) 操作二:d=ab,(a,b)>(a,d)d=|a-b|,(a, b) -> (a, d)


例子以(35,14)为例,箭头上的标注是对谁做改变,保证a>=ba>=b

image.png

因为是可以对任意一个数进行改变,而且后面的变换还会循环到前面的状态。所以时刻保证a>=ba>=b,可以发现,当只进行(a,b)>(d,b)(a,b)->(d,b)操作时,可以保证每一个数都出现。

所以时刻保证a>=ba>=b,一直进行(a,b)>(d,b)(a,b)->(d,b)操作

但是由于a的值很大,过程中会超时。当a很大的时候,a相当于一直进行减b的操作,变成a%ba\%b的过程中看是否出现x。这个过程使用余数的数学技巧,如果a%b=x%ba\%b=x\%b则代表出现过x,没有出现则a直接变成a%ba\%b

#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;
 }