描述
题解
一看这道题我就知道是数论,也知道和欧几里得算法有关,但是再多的我就不知道了,因为根本不知道从哪儿推,无从下手的感觉,数论差真是心塞,网上找了份不错的代码,但是不是太懂其中推导过程。
如果有大神知道为什么这么写,烦请告知推导过程……十分、万分感谢!
代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
ll ans = exgcd(b, a%b, x, y);
ll temp = x;
x = y;
y = temp - a/b*y;
return ans;
}
int main()
{
int K;
cin >> K;
ll X, Y, S, T;
while (K--)
{
scanf("%lld%lld%lld%lld", &X, &Y, &S, &T);
ll a, b;
ll g = exgcd(X, Y, a, b);
ll c = a * T / g;
ll d = b * T / g;
a *= S / g;
b *= S / g;
if (S % g == 0 && T % g == 0)
{
bool flag = 0;
for (int i = -2; i <= 2; i++)
{
ll x, y;
x = a + X / g * i;
y = b - Y / g * i;
for (int j = -2; j <= 2; j++)
{
ll x_, y_;
x_ = c + X / g * j;
y_ = d - Y / g * j;
if ((x + y_) % 2 == 0 && (x_ + y) % 2 == 0)
{
flag = 1;
break;
}
}
}
if (flag)
{
puts("Y");
}
else
{
puts("N");
}
}
else
{
puts("N");
}
}
return 0;
}