2013长春网赛1001 hdu 4759 Poker Shuffle
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4759
题意:有一堆2^n的牌,牌原先按(1,2,....k)排序,每一次洗牌都将牌分成两种情况:(1,3,5,....k-1)或(2,4,6,.....k),
给出四个数:A X B Y ,问有没有可能出现A位置的牌序号为X,B位置的牌序号是Y。输出Yes或No。
1 <= N <= 1000, 1 <= A, B, X, Y <= 2^N.
分析:二进制的运用。
题目给的牌编号是从一开始的,要先将其转成从0开始的。
一开始的编号是0~2^N-1,每次洗牌的过程如下:
第一种洗牌:将奇数放前面,偶数放后面。每个位置的数的变化相当于二进制数右移一位(相当于除以2),然后最高位异或1。
第二种洗牌:将偶数放前面,奇数放后面。每个位置的数的变化相当于二进制数右移一位(相当于除以2),然后最高位异或0。
这样就把位置为i的牌,经过一次洗牌后的位置算出来了。
例如: 牌: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
位置: 0 1 2 3 4 5 6 7 变成 4 0 5 1 6 2 7 3
二进制: 000 001 010 011 100 101 110 111 100 000 101 001 110 010 111 011
上面的是第一种洗牌方式,可以看出奇数在前,偶数在后。
下面是第一种洗牌的规律:
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)
可以看出,经过若按同一种洗牌方式,经过2*n次洗牌后,牌堆会恢复到原来的序列。
但是题目有两种洗牌方式,是反过来的,所以只要经过n次洗牌后就会恢复原来的序列了。
也就是说对于一堆2^n的牌,最多只有n种不同的序列,也就是最多右移n位,超过n位就会重复了。
经过若干次洗牌,可以看成是右移了k位,然后异或上一个数。
所以首先将A X B Y都减一,然后枚举X,Y右移k位以后,能不能同时异或上相同的数得到A,B。
由于a^b=c,可以得到a^c=b
解法总结如下:
从1到n枚举右移X,Y,每次判断X^A是否等于Y^B。
n比较大,要用大数。
用java大数来处理比较方便。
AC 代码:
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
static int n;
public static BigInteger right(BigInteger a) //循环移位
{
BigInteger tmp=a.and(BigInteger.ONE); //取出最低位作为右移后的首位
return a.shiftRight(1).or(tmp.shiftLeft(n-1)); //将最低位加到最高位上
}
public static void main(String[] args) {
int i,t,k,flag;
BigInteger A,B,X,Y,a,b;
Scanner cin=new Scanner(System.in);
t=cin.nextInt();
for(i=1;i<=t;i++)
{
n=cin.nextInt();
A=cin.nextBigInteger();
X=cin.nextBigInteger();
B=cin.nextBigInteger();
Y=cin.nextBigInteger(); A=A.add(BigInteger.valueOf(-1)); //从0开始
X=X.add(BigInteger.valueOf(-1));
B=B.add(BigInteger.valueOf(-1));
Y=Y.add(BigInteger.valueOf(-1)); flag=0;
for(k=1;k<=n;k++)
{
X=right(X);
Y=right(Y);
a=X.xor(A);
b=Y.xor(B);
if(a.equals(b))
{
flag=1;
break;
}
}
if(flag==1)
System.out.println("Case "+i+": Yes");
else
System.out.println("Case "+i+": No");
}
} }
2013长春网赛1001 hdu 4759 Poker Shuffle的更多相关文章
- 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...
- 2013长春网赛1005 hdu 4763 Theme Section(kmp应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题意:给出一个字符串,问能不能在该串的前中后部找到相同的子串,输出最长的字串的长度. 分析:km ...
- 2013长春网赛1004 hdu 4762 Cut the Cake
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题意:有个蛋糕,切成m块,将n个草莓放在上面,问所有的草莓放在同一块蛋糕上面的概率是多少.2 & ...
- 2013长春网赛1010 hdu 4768 Flyer
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:有n个社团发传单,每个社团发给编号为A_i, A_i+C_i,A_i+2*C_i,…A_i ...
- 2013长春网赛 1006 hdu 4764 Stone(巴什博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 题意:Tang 和 Jiang 玩一个游戏,轮流写下一个数,Tang先手,第一次Tang只能写[ ...
- 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
- HDU 4759 Poker Shuffle(2013长春网络赛1001题)
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 4759 Poker Shuffle
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 4764 && 2013长春网赛题解
一个组合游戏题. 解答: 从后面往前面推,首先n-1是必胜位,然后前面的k位是必败位,如此循环下去.所以题目就容易了! 代码: #include<cstdio> using namespa ...
随机推荐
- css3动画功能介绍
一:过渡动画---Transitions 含义:在css3中,Transitions功能通过将元素的某个属性从一个属性值在指定的时间内平滑过渡到另一个属性值来实现动画功能. Transitions属性 ...
- ROS launch 文件的编写
ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...
- rsync+inotifywait
0.rsync+inotify是实现文件实时同步的,加什么参数才能实现实时同步,--delete参数又是什么意思? 1.运行模式(服务器) rsync有两种常用的认证方式,一种是rsync-daemo ...
- hung task机制
最近在修改内核源码的时候一直出现格式化磁盘的时候,进程会出现状态D,看内核日志会看到如下信息: INFO: task filebench: blocked seconds. Oct :: localh ...
- 20155234 Exp3 免杀原理与实践
使用msf编码器生成jar包 使用指令:msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.157.141 lport=5234 x> ...
- 【MEF】构建一个WPF版的ERP系统
原文:[MEF]构建一个WPF版的ERP系统 引言 MEF是微软的一个扩展性框架,遵循某种约定将各个部件组合起来.而ERP系统的一大特点是模块化,它们两者的相性很好,用MEF构建一个ERP系统是相当合 ...
- sprintboot 和swagger2整合生成文档
1.创建springboot 工程 2.引入maven依赖 <dependency> <groupId>io.springfox</groupId> <art ...
- 蒙提霍尔游戏 python 模拟
本文使用蒙特卡罗方法验证蒙提霍尔游戏的结论. 以下代码,本人原创! 完整代码 import random # 蒙提霍尔游戏 def play_game(strategy='nonchange'): # ...
- 蓝牙inquiry流程之Inquiry Complete处理
inquiry流程一般持续有12s多,当inquiry完成的时候,设备端会上报一个Event: Inquiry Complete 上来,那协议栈是如何把这个事件上传到应用层的呢?本篇文章来分析一下其具 ...
- JS设置状态栏
JS设置状态栏可通过window.status = str来设置,在后台可通过 ClientScript.RegisterStartupScript( this.GetType(), "12 ...