您的位置:首页 > 其它

[BZOJ2299] [HAOI2011]向量

2016-02-28 23:16 302 查看

传送门

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

题目大意

给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。

题解

其实就是(a,b),(a,−b),(b,a),(b,−a)(a,b),(a,-b),(b,a),(b,-a)四个,设分别用它们的次数为t1,t2,t3,t4t_1,t_2,t_3,t_4

然后列方程组

a(t1+t2)+b(t3+t4)=xa(t3−t4)+b(t1−t2)=ya(t_1+t_2)+b(t_3+t_4)=x\\a(t_3-t_4)+b(t_1-t_2)=y

我们很容易发现两数之和和之差奇偶性是相同的

就用扩展欧几里德解出来然后调整再判奇偶性即可

var
v,l:longint;
a,b,aa,bb,x,y,xx,yy,o,p,q,r,tt:int64;
function gcd(a,b:int64):int64;
begin
if b=0 then gcd:=a else gcd:=gcd(b,a mod b);
end;

procedure exgcd(a,b:int64;var x,y:int64);
var c:int64;
begin
if b=0
then begin x:=1; y:=0; end
else begin exgcd(b,a mod b,x,y); c:=x; x:=y; y:=c-y*(a div b); end;
end;

begin
readln(v);
for l:=1 to v do
begin
readln(a,b,x,y);
tt:=gcd(a,b); if (x mod tt<>0)or(y mod tt<>0) then begin writeln('N'); continue; end;
xx:=x div tt; yy:=y div tt; aa:=a div tt; bb:=b div tt;
exgcd(aa,bb,o,p); o:=xx*o; p:=xx*p;
exgcd(aa,bb,q,r); q:=yy*q; r:=yy*r;
aa:=aa mod 2; bb:=bb mod 2;
if (o mod 2=r mod 2)and(p mod 2=q mod 2) then begin writeln('Y'); continue; end;
if (((o mod 2<>r mod 2)and(p mod 2=q mod 2))or((o mod 2=r mod 2)and(p mod 2<>q mod 2)))and(((aa=0)and(bb=1))or((aa=1)and(bb=0))) then begin writeln('Y'); continue; end;
if (o mod 2<>r mod 2)and(p mod 2<>q mod 2)and((aa=1)or(bb=1)) then begin writeln('Y'); continue; end;
writeln('N');
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: