NYOJ-1250-机器人

xiaoxiao2021-02-27  222

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; }
转载请注明原文地址: https://www.6miu.com/read-11101.html

最新回复(0)