`
he91_com
  • 浏览: 378782 次
文章分类
社区版块
存档分类
最新评论

hdu 2965 Business Cards

 
阅读更多

这题忘了开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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics