题目详解:
扩展欧几里得算法的应用。
ax+by=gcd(a,b)。
用朴素的语言讲就是两个数a,b。
对于整数x,y:ax+by可以组成 a,b最大公约数的任意倍数。
打个比方 2和7。
2x+7y可以组成任意整数。
1=2(-3)+7
2=2+0
3=2(-2)+7
……
3和15
则只能组成3的倍数。
所以对于两个数,答案就是 if(d%gcd(a,b))。
对于三个数,可以理解成 d对于 gcd(a,b)和c。
所以答案就是 if(d%gcd(a,b,c))。
but这只有60pt(血一样的教训)。
注意一下,如果a,b,c为0的情况,
要特判。
#include<bits/stdc++.h> using namespace std; #define ll long long ll gcd(ll x,ll y) { x=abs(x); y=abs(y); if(x<y) swap(x,y); ll m=y; while(m!=0) { m=x%y; x=y; y=m; } return x; } ll x,y,z,d,an; int main() { int t,f=0; cin>>t; while(t--) { cin>>x>>y>>z>>d; if(d==0) { cout<<"YES"<<endl; continue; } an=gcd(x,gcd(y,z)); d=abs(d); if(an==0) cout<<"NO"<<endl; else if(d%an==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }