NYOJ-1250-机器人

来源:互联网 发布:淘宝店必须交保证金吗 编辑:程序博客网 时间:2024/06/06 00:46

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;}
0 0