数学找规律题,真的妙蛙种子吃妙脆角——妙到家了
题意:给定两个数,操作为使两数之一变为他们差值的绝对值,给定x,问操作过程中能否使两数之一变为x?
首先模拟一下操作过程中数的变化
可以观察出,每次变化都会分出两个分支,而其中一个分支会指向另一分支与原数据,因此,要想最小操作步骤就应该按照这样的规律路来变数:每次变换都变换两个数当中较大的数
但是这样由于数据范围为1e18次方,会TLE,思索优化方案
观察大数据情况:发现对于两个较大的数,相减过程会出现较大的差值,导致重复减一个数
因此,可用取模运算优化该步骤,而如何确定取模过程中有无答案出现,进行一下判断
b>=x&&b%a==x%a
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#define pb push_back
#define endl '\n'
#define x first
#define y second
using namespace std;
const int N = 200010, M = N;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef pair<ll, ll> PLL;
int n, m;
//int hh = 0, tt = -1;
bool cmp(PLL a, PLL b) { if (a.y == b.y)return a.x < b.x; else return a.y < b.y; }
void init()
{
}
void solve()
{
ll a, b, x;
cin >> a >> b >> x;
if (a > b)swap(a, b);
while (a && b)
{
if (a > b)swap(a, b);
if (b % a == x % a && b >= x) {
puts("YES");
return;
}
b %= a;
}
puts("NO");
}
int main()
{
int _;
cin >> _;
//_ = 1;
while (_--)
{
init();
solve();
}
return 0;
}
/*
# _oo0oo_
# o8888888o
# 88" . "88
# (| -_- |)
# 0\ = /0
# ___/`---'\___
# .' \\| |// '.
# / \\||| : |||// \
# / _||||| -:- |||||- \
# | | \\\ - /// | |
# | \_| ''\---/'' |_/ |
# \ .-\__ '-' ___/-. /
# ___'. .' /--.--\ `. .'___
# ."" '< `.___\_<|>_/___.' >' "".
# | | : `- \`.;`\ _ /`;.`/ - ` : | |
# \ \ `_. \_ __\ /__ _/ .-` / /
# =====`-.____`.___ \_____/___.-`___.-'=====
# `=---='
#
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# 佛祖保佑 永无BUG
*/