hdu4759 Poker Shuffle 2013 ACM/ICPC Asia Regional Changchun Online
2013-10-06 12:33
483 查看
找了很久的规律,只看十进制数字,各种乱七八糟的规律=没规律!
看了别人的解题报告,虽然看懂了,可是怎么发现的这个规律呢T.T~想了很久很久~
以下是转载的别人的图,自己再画太麻烦了~
全部看出0~2n-1-1,下标从0开始!!!
每次洗牌的时候,奇数在后偶数在前时,只需循环右移一下,如下:
0(000) -->0(000) -->0(000) -->0(000)
1(001) -->4(100) -->2(010) -->1(001)
2(010) -->1(001) -->4(100) -->2(010)
3(011) -->5(101) -->6(110) -->3(011)
4(100) -->2(010) -->1(001) -->4(100)
5(101) -->6(110) -->3(011) -->5(101)
6(110) -->3(011) -->5(101) -->6(110)
7(111) -->7(111) -->7(111) -->7(111)
每一列就是一种情况,前一列就是洗牌之后的情况,发现二进制的规律。
奇数在前偶数在后时,只需右移一下,高位亦或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,偶数在前高位异或0,经过很多次移动之后,可能每一位了异或了一个1了,
也或许有的异或了,有的没异或,但是不管过程怎样,只要是异或,那么这些数字都得一起异或,即每一列
中的每一个数字都要异或这些,每两个任意的数字都是经过相同的变化得来的。
所以输入A, X, B, Y,执行A--;X--;B--;Y--;这些操作~
即A xor C = X;B xor C = Y,C就是整个移动的过程。交换律即A xor X = B xor Y = C
最后大数判断A xor X 与B xor Y是否相等即可。
View Code
看了别人的解题报告,虽然看懂了,可是怎么发现的这个规律呢T.T~想了很久很久~
以下是转载的别人的图,自己再画太麻烦了~
全部看出0~2n-1-1,下标从0开始!!!
每次洗牌的时候,奇数在后偶数在前时,只需循环右移一下,如下:
0(000) -->0(000) -->0(000) -->0(000)
1(001) -->4(100) -->2(010) -->1(001)
2(010) -->1(001) -->4(100) -->2(010)
3(011) -->5(101) -->6(110) -->3(011)
4(100) -->2(010) -->1(001) -->4(100)
5(101) -->6(110) -->3(011) -->5(101)
6(110) -->3(011) -->5(101) -->6(110)
7(111) -->7(111) -->7(111) -->7(111)
每一列就是一种情况,前一列就是洗牌之后的情况,发现二进制的规律。
奇数在前偶数在后时,只需右移一下,高位亦或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,偶数在前高位异或0,经过很多次移动之后,可能每一位了异或了一个1了,
也或许有的异或了,有的没异或,但是不管过程怎样,只要是异或,那么这些数字都得一起异或,即每一列
中的每一个数字都要异或这些,每两个任意的数字都是经过相同的变化得来的。
所以输入A, X, B, Y,执行A--;X--;B--;Y--;这些操作~
即A xor C = X;B xor C = Y,C就是整个移动的过程。交换律即A xor X = B xor Y = C
最后大数判断A xor X 与B xor Y是否相等即可。
import java.math.*; import java.util.*; public class Main{ static int n; static Scanner cin = new Scanner(System.in); static BigInteger rot(BigInteger x){ BigInteger tmp = x.and(BigInteger.valueOf(1)); return x.shiftRight(1).or(tmp.shiftLeft(n-1)); } public static void main(String[] args){ int t = cin.nextInt(), cases=0; while(++cases <= t){ n = cin.nextInt(); BigInteger A = cin.nextBigInteger(), X = cin.nextBigInteger(); BigInteger B = cin.nextBigInteger(), Y = cin.nextBigInteger(); A = A.add(BigInteger.valueOf(-1)); B = B.add(BigInteger.valueOf(-1)); X = X.add(BigInteger.valueOf(-1)); Y = Y.add(BigInteger.valueOf(-1)); String ans = "No"; for(int i=0; i <= n; i++){ A = rot(A); B = rot(B); BigInteger tmpx = A.xor(X); BigInteger tmpy = B.xor(Y); if(tmpx.compareTo(tmpy)==0){ ans = "Yes"; break; } } System.out.println("Case " + cases + ": " + ans); } } }
View Code
相关文章推荐
- 2013 ACM/ICPC Asia Regional Changchun Online (2013网络赛)
- 2013 ACM/ICPC Asia Regional Changchun Online----hdu4762 Cut the Cake
- 2013 ACM/ICPC Asia Regional Changchun Online
- hdu 4768 Flyer 二分(2013 ACM/ICPC Asia Regional Changchun Online 1010)
- hdu 4762 Cut the Cake 概率(2013 ACM/ICPC Asia Regional Changchun Online 1004)
- 2013 ACM/ICPC Asia Regional Changchun Online
- 2013 ACM/ICPC Asia Regional Changchun Online Problem J & hdu4768 Flyer(二分)
- hdu 4272 LianLianKan ( dp + 状态压缩 2012 ACM/ICPC Asia Regional Changchun Online)
- 2015 ACM/ICPC Asia Regional Changchun Online(1007)
- hdu 5438 Ponds 拓扑排序+并查集 2015 ACM/ICPC Asia Regional Changchun Online
- hdu 5437 2015 ACM/ICPC Asia Regional Changchun Online 1002 优先队列
- hdu 5443 The Water Problem 2015 ACM/ICPC Asia Regional Changchun Online
- 2015 ACM/ICPC Asia Regional Changchun Online 1007 hdu 5443 线段树区间最值
- 1001_Alisha’s Party_2015 ACM/ICPC Asia Regional Changchun Online(优先队列)
- 2012 ACM/ICPC Asia Regional Changchun Online
- HDU 5444 Elven Postman(链表实现二叉搜索树)——2015 ACM/ICPC Asia Regional Changchun Online
- HDU 5443 The Water Problem(水题 找区间最大值)——2015 ACM/ICPC Asia Regional Changchun Online
- HDU 5438 Ponds(dfs)——2015 ACM/ICPC Asia Regional Changchun Online
- HDU 5437 Alisha’s Party (Priority_queue)2015 ACM/ICPC Asia Regional Changchun Online
- HDU 5441.Travel【2015 ACM/ICPC Asia Regional Changchun Online】【并查集】9月18