数论思维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=∣a−b∣,(a,b)−>(d,b)
操作二: d = ∣ a − b ∣ , ( a , b ) − > ( a , d ) d=|a-b|,(a, b) -> (a, d) d=∣a−b∣,(a,b)−>(a,d)
例子以(35,14)为例,箭头上的标注是对谁做改变,保证 a > = b a>=b a>=b
因为是可以对任意一个数进行改变,而且后面的变换还会循环到前面的状态。所以时刻保证 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)