这题忘了开long long了,以后数论题尽量都开long long吧。。。
三种情况1、全部横着放
2、全部竖放
3、横竖交叉放,其中一条边要是a,b最小公倍数的倍数,另外一边直接解模线性方程
#include<stdio.h>
typedef long long LL;
LL getgcd(LL a,LL b)
{
if(!b)return a;
return getgcd(b,a%b);
}
void gcd(LL a,LL b,LL& d,LL& x,LL& y)
{
if(!b){d=a;x=1;y=0;}
else
{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
bool calcu(LL a,LL b,LL x,LL y)
{
if(x<0)
{
while(x<0)
{
x+=b;
y-=a;
}
if(y>0)
return true;
}
else if(y<0)
{
while(y<0)
{
x-=b;
y+=a;
}
if(x>0)
return true;
}
return false;
}
int main()
{
int t;
LL a,b,c,d;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d);
if(c%a==0&&d%b==0||c%b==0&&d%a==0)
printf("YES\n");
else
{
LL p=getgcd(a,b);
if(c%p||d%p)
printf("NO\n");
else
{
a/=p;b/=p;
c/=p;d/=p;
LL x,y,gg=a*b,v;
if(c%gg==0)
{
//printf("d=%d,",d);
gcd(a,b,v,x,y);
//printf("x=%d,y=%d\n",x,y);
if(calcu(a,b,x*d,y*d))
{
printf("YES\n");
continue;
}
}
if(d%gg==0)
{
//printf("c=%d,",c);
gcd(a,b,v,x,y);
//printf("x=%d,y=%d\n",x,y);
if(calcu(a,b,x*c,y*c))
{
printf("YES\n");
continue;
}
}
printf("NO\n");
}
}
}
return 0;
}