2020牛客NOIP赛前集训营-提高组(第一场)T1
牛牛的方程式
https://ac.nowcoder.com/acm/contest/7605/A
思路
这道题我们要求 是否有整数解
,
我们可以先讨论 是否有整数解,然后再看
,是否有整数解,
于是我们可以考虑用裴蜀定理
裴蜀定理
设 ,则存在整数
使得
所以存在整数 使得
的条件是
接下来我们求出 的最大公约数即可,根据题目还有
,以此类推,我们只需要判断是否
且
综上所述,我们只需要判断是否 即可
P.S.如果想求出一组解需要用扩展欧几里得算法
代码
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; int T; ll a ,b ,c ,d; ll gcd (ll r1 ,ll r2) {//欧几里得算法(辗转相除法) while (r2) { r1 %= r2; swap (r1 ,r2); } return r1; } int main () { scanf ("%d",&T); while (T --) { scanf ("%lld%lld%lld%lld",&a ,&b ,&c ,&d); a = abs (a) ,b = abs (b) ,c = abs (c) ,d = abs (d);//注意可能会有负数 if (d == 0) { puts ("YES"); continue; } ll cmp = gcd (a , gcd (b ,c)); if (cmp == 0) { puts ("NO"); continue; } if (d % cmp != 0) { puts ("NO"); continue; } puts ("YES"); } return 0; }
谢谢大家