思路:主要是二进制的运用。
为了方便从0开始,首先看下右移一下,高位异或1的规律:(可以从右往左一列一列看)
000(0) -> 100(4) -> 110(6) -> 111(7) -> 011(3) -> 001(1) -> 000(0)
001(1) -> 000(0) -> 100(4) -> 110(6) -> 111(7) -> 011(3) -> 001(1)
010(2) -> 101(5) -> 010(2) -> 101(5) -> 010(2) -> 101(5) -> 010(2)
011(3) -> 001(1) -> 000(0) -> 100(4) -> 110(6) -> 111(7) -> 011(3)
100(4) -> 110(6) -> 111(7) -> 011(3) -> 001(1) -> 000(0) -> 100(4)
101(5) -> 010(2) -> 101(5) -> 010(2) -> 101(5) -> 010(2) -> 101(5)
110(6) -> 111(7) -> 011(3) -> 001(1) -> 000(0) -> 100(4) -> 110(6)
111(7) -> 011(3) -> 001(1) -> 000(0) -> 100(4) -> 110(6) -> 111(7)
每次洗牌的时候,奇数在后偶数在前时,只需右移一下;奇数在前偶数在后时,只需右移一下,高位亦或1.
而且每层的任意2个数异或的结果相同。
对于给定的n,a,b,x,y;只需判断a^b==x^y(此处是异或运算符)既可。
代码如下:
import java.math.*;
import java.util.*;
public class Main {
public static void main(String arg[]){
BigInteger a,b,c,x,y;
Scanner cin=new Scanner(System.in);
int t=,n,tt;
c=BigInteger.ONE;
tt=cin.nextInt();
while(tt-->){
n=cin.nextInt();
a=cin.nextBigInteger();a=a.subtract(c);
x=cin.nextBigInteger();x=x.subtract(c);
b=cin.nextBigInteger();b=b.subtract(c);
y=cin.nextBigInteger();y=y.subtract(c);
a=a.xor(b);
x=x.xor(y);
boolean flag=false;
for(int i=;i<n;i++){
if(a.equals(x)){
flag=true;
break;
}
if(a.testBit()){
a=a.shiftRight();
a=a.setBit(n-);
}else a=a.shiftRight();
}
if(flag) System.out.println("Case "+t+": Yes");
else System.out.println("Case "+t+": No");
t++;
}
}
}