数论思维D. X-Magic Pair

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论思维D. X-Magic Pair相关的知识,希望对你有一定的参考价值。

题目链接:
https://codeforces.com/problemset/problem/1612/D

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


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

a b b a b b a a a b b a 35,14 21,14 35,21 14,7 7,7 21,7 14,7

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

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

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

以上是关于数论思维D. X-Magic Pair的主要内容,如果未能解决你的问题,请参考以下文章

D. Equalize the Remainders set的使用+思维

D. Not Quite Lee(裴蜀定理gcdlowbit)

D. Not Quite Lee(裴蜀定理gcdlowbit)

D. Not Quite Lee(裴蜀定理gcdlowbit)

余数(数论分块)

BZOJ1257余数之和(数论分块,暴力)