标签:follow problem algorithm tchar cee text index fine HERE
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 531 Accepted Submission(s): 300
给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则:
1. 任意选择一个堆,假设该堆有x个物品,从中选择k个,要保证0<k<x且0<(x^k)<x。
2. 再增加一个大小为x^k的堆(也就相当于将一个x个物品的堆变成一个k个物品的堆和一个x^k个物品的堆),另外有一个技能,可以将这个大小为x^k的堆变成(2*k)^x的堆,但是这个技能每个人只有一次机会可以使用。
现在问两人轮流操作,都采取最优策略,最后不能操作的人输,问谁会赢。
解题思路
把每堆原来a个物品分成两堆,k和k^a,证明得,这样分堆,不会影响二进制中1的总数的奇偶性,(后面会给出证明)为什么要考虑二进制呢?
注意题目中的条件,x^k<x,所以当x的二进制表示中只有一个1时就不能再分了。所以终止条件也有了。
对于操作,因为是乘二,所以并不影响奇偶性结果。
设一堆数目中二进制表示1的个数是m,则所有要操作的步骤就是所有的(m-1)加起来。讨论这个总数的奇偶性就行了。
为何分堆不影响二进制中1的总数的奇偶性?
考虑x的某一位p,分四种情况:
1. 如果x的第p位为1且k的第p位也为1,那么(x^k)的第p位就是0.
2. 如果x的第p位为1且k的第p位也为0,那么(x^k)的第p位就是1.
3. 如果x的第p位为0且k的第p位也为1,那么(x^k)的第p位就是1.
4. 如果x的第p位为0且k的第p位也为0,那么(x^k)的第p位就是0.
综上,此题可以解决。
如何统计二进制中1的个数?
可以对2不断取模进行,也可以使用n&(n-1)
后面的证明看博客https://blog.csdn.net/u013243347/article/details/52220551
1 /** 2 * ┏┓ ┏┓ 3 * ┏┛┗━━━━━━━┛┗━━━┓ 4 * ┃ ┃ 5 * ┃ ━ ┃ 6 * ┃ > < ┃ 7 * ┃ ┃ 8 * ┃... ⌒ ... ┃ 9 * ┃ ┃ 10 * ┗━┓ ┏━┛ 11 * ┃ ┃ Code is far away from bug with the animal protecting 12 * ┃ ┃ 神兽保佑,代码无bug 13 * ┃ ┃ 14 * ┃ ┃ 15 * ┃ ┃ 16 * ┃ ┃ 17 * ┃ ┗━━━┓ 18 * ┃ ┣┓ 19 * ┃ ┏┛ 20 * ┗┓┓┏━━━━━━━━┳┓┏┛ 21 * ┃┫┫ ┃┫┫ 22 * ┗┻┛ ┗┻┛ 23 */ 24 #include<iostream> 25 #include<cstdio> 26 #include<cmath> 27 #include<cstring> 28 #include<algorithm> 29 #include<map> 30 #include<vector> 31 #define mem(a,b) memset(a,b,sizeof(a)) 32 #define ll long long 33 #define inf 1000000000 34 #define maxn 1005 35 #define maxm 100005 36 #define eps 1e-10 37 #define for0(i,maxn) for(int i=1;i<=(maxn);++i) 38 #define for1(i,maxn) for(int i=1;i<=(maxn);++i) 39 #define for2(i,x,y) for(int i=(x);i<=(y);++i) 40 #define for3(i,x,y) for(int i=(x);i>=(y);--i) 41 #define mod 1000000007 42 using namespace std; 43 inline int read() 44 { 45 int x=0,f=1;char ch=getchar(); 46 while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) f=-1;ch=getchar();} 47 while(ch>=‘0‘&&ch<=‘9‘) {x=10*x+ch-‘0‘;ch=getchar();} 48 return x*f; 49 } 50 int getsg(int n) 51 { 52 int count=0; 53 while(n) 54 { 55 n&=(n-1); 56 count++; 57 } 58 return count; 59 } 60 int main() 61 { 62 int T,n; 63 T=read(); 64 int index=0; 65 while(T--) 66 { 67 printf("Case %d: ",++index); 68 n=read(); 69 int ans=0; 70 for(int i=1;i<=n;++i) ans+=(getsg(read())-1); 71 if(ans&1) puts("Yes"); 72 else puts("No"); 73 } 74 }
HDU 4388 Stone Game II {博弈||找规律}
标签:follow problem algorithm tchar cee text index fine HERE
原文地址:https://www.cnblogs.com/TYH-TYH/p/9424933.html