hdu 4759 Poker Shuffle 二进制

思路:主要是二进制的运用。

为了方便从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(此处是异或运算符)既可。

代码如下:

 1 import java.math.*;
 2 import java.util.*;
 3 public class Main {
 4     public static void main(String arg[]){
 5         BigInteger a,b,c,x,y;
 6         Scanner cin=new Scanner(System.in);
 7         int t=1,n,tt;
 8         c=BigInteger.ONE;
 9         tt=cin.nextInt();
10         while(tt-->0){
11             n=cin.nextInt();
12             a=cin.nextBigInteger();a=a.subtract(c);
13             x=cin.nextBigInteger();x=x.subtract(c);
14             b=cin.nextBigInteger();b=b.subtract(c);
15             y=cin.nextBigInteger();y=y.subtract(c);
16             a=a.xor(b);
17             x=x.xor(y);
18             boolean flag=false;
19             for(int i=0;i<n;i++){
20                 if(a.equals(x)){
21                     flag=true;
22                     break;
23                 }
24                 if(a.testBit(0)){
25                     a=a.shiftRight(1);
26                     a=a.setBit(n-1);
27                 }else a=a.shiftRight(1);
28             }
29             if(flag) System.out.println("Case "+t+": Yes");
30             else System.out.println("Case "+t+": No");
31             t++;
32         }
33     }
34 }
View Code