牛客NOIP集训一S 牛牛的方程式 TJ
思路
这道题我们要求 \(ax+by+cz=d\) 是否有整数解 \(x,y,z\),
我们可以先讨论 \(ax + by = d\) 是否有整数解,然后再看 \(ax+by+cz=d\) ,是否有整数解,
于是我们可以考虑用裴蜀定理
裴蜀定理
设 \(d=\gcd(a ,b)\),则存在整数 \(x,y\) 使得 \(ax+by = d.\)
所以存在整数 \(x,y\) 使得 \(ax+by = d.\) 的条件是 \(\gcd(a,b)|d\)
接下来我们求出 \(a,b\) 的最大公约数即可,根据题目还有 \(c\),以此类推,我们只需要判断是否 \(\gcd(c,b)|d\) 且 \(\gcd(c,a)|d\)
综上所述,我们只需要判断是否 \(\gcd(a,b,c)|d\) 即可
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;
}
cb