思路
这道题我们要求 (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;
}