BZOJ2299: [HAOI2011]向量

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2299

题解:乱搞就可以了。。。

不妨认为有用的只有(a,b)(a,-b)(b,a)(b,-a)

然后设他们的系数分别为x1,x2,x3,x4,则有

(x1+x2)*a+(x3+x4)*b=x

(x1-x2)*b+(x3-x4)*a=y

方程ax+by=c有解的充要条件是c|gcd(a,b)

但这样并不能保证方程组有解,所以还要满足一个条件就是x1+x2与x1-x2同奇偶,34同理。

我们只要求出解的通项然后随便带两个本质不同的进去就行了。当然多一点也不会超时。

代码:

  1 #include<cstdio>
  2 
  3 #include<cstdlib>
  4 
  5 #include<cmath>
  6 
  7 #include<cstring>
  8 
  9 #include<algorithm>
 10 
 11 #include<iostream>
 12 
 13 #include<vector>
 14 
 15 #include<map>
 16 
 17 #include<set>
 18 
 19 #include<queue>
 20 
 21 #include<string>
 22 
 23 #define inf 1000000000
 24 
 25 #define maxn 200000+5
 26 
 27 #define maxm 200000+5
 28 
 29 #define eps 1e-10
 30 
 31 #define ll long long
 32 
 33 #define pa pair<int,int>
 34 
 35 #define for0(i,n) for(int i=0;i<=(n);i++)
 36 
 37 #define for1(i,n) for(int i=1;i<=(n);i++)
 38 
 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 40 
 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 42 
 43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 44 
 45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
 46 
 47 #define mod 1000000007
 48 
 49 #define mid ((l+r)>>1)
 50 
 51 #define lch k<<1,l,mid
 52 
 53 #define rch k<<1|1,mid+1,r
 54 
 55 using namespace std;
 56 
 57 inline int read()
 58 
 59 {
 60 
 61     int x=0,f=1;char ch=getchar();
 62 
 63     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 64 
 65     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 66 
 67     return x*f;
 68 
 69 }
 70 inline void exgcd(ll a,ll b,ll &x,ll &y)
 71 {
 72     if(!b){x=1;y=0;return;}
 73     exgcd(b,a%b,x,y);
 74     ll t=x;x=y;y=t-a/b*y;
 75 }
 76 inline ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
 77 inline bool check(ll x1,ll x2,ll x3,ll x4){return ((x1&1)==(x4&1))&&((x2&1)==(x3&1));}
 78 
 79 int main()
 80 
 81 {
 82 
 83     freopen("input.txt","r",stdin);
 84 
 85     freopen("output.txt","w",stdout);
 86 
 87     int T=read();
 88     while(T--)
 89     {
 90         ll a=abs(read()),b=abs(read()),x=read(),y=read(),t=gcd(a,b),x1,x2,x3,x4,c,d;bool flag=0;
 91         if(a<b)swap(a,b);
 92         if(!a&&!b){if(!x&&!y)flag=0;else flag=1;}
 93         else if(x%t||y%t)flag=1;
 94         else 
 95         {
 96             exgcd(a,b,c,d);
 97             a/=t;b/=t;
 98             x1=c*(x/t);x2=d*(x/t);
 99             x3=c*(y/t);x4=d*(y/t);
100             if(check(x1,x2,x3,x4)||check(x1+b,x2-a,x3,x4)||check(x1,x2,x3+b,x4-a)||check(x1+b,x2-a,x3+b,x4-a))flag=0;
101             else flag=1;
102         }
103         puts(flag?"N":"Y");
104     }
105 
106     return 0;
107 
108 }  
View Code

 

posted @ 2015-01-30 11:02  ZYF-ZYF  Views(325)  Comments(0Edit  收藏  举报