ACM模版
描述
题解
一看这道题我就知道是数论,也知道和欧几里得算法有关,但是再多的我就不知道了,因为根本不知道从哪儿推,无从下手的感觉,数论差真是心塞,网上找了份不错的代码,但是不是太懂其中推导过程。
如果有大神知道为什么这么写,烦请告知推导过程……十分、万分感谢!
代码
#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;
}