牛客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;
}

posted @ 2020-10-18 10:06  tuscjaf  阅读(89)  评论(0编辑  收藏  举报