poj -2975 Nim】的更多相关文章

[题目链接] http://poj.org/problem?id=2975 [题目大意] 问在传统的nim游戏中先手必胜策略的数量 [题解] 设sg=a1^a1^a3^a4^………^an,当sg为0时为必败态, 因此先手只需改变一个aj,让其减少m,使得sg^aj^(aj-m)=0即可让对手处于必败态, 即先手必胜策略,因为异或为0的两个数相同,所以sg^aj=aj-m, 即m=aj-sg^aj,因为m大于0,所以aj>sg^aj,至此我们就得到了必胜策略的重要条件 [代码] #include…
题目链接题意介绍了一遍Nim取石子游戏,可以看上一篇文章详细介绍.问当前状态的必胜走法个数,也就是走到必败状态的方法数. 我们设sg为所有个数的Xor值.首先如果sg==0,它不可能有必胜走法,输出0. 对于任意一堆有a[i]个石子,若sg Xor a[i] <= a[i] ,那么我们就可以在a[i]里面取出sg Xor a[i]个石子,使得剩下石子Xor和为0,于是ans++.然后输出ans. 注意C/C++语言中^操作比<操作优先级低. #include<iostream> #…
  Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4312   Accepted: 1998 Description Nim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player’s move consists of removing one or m…
Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5232   Accepted: 2444 Description Nim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player’s move consists of removing one or mor…
令ans=a1^a2^...^an,如果需要构造出异或值为0的数, 而且由于只能操作一堆石子,所以对于某堆石子ai,现在对于ans^ai,就是除了ai以外其他的石子 的异或值,如果ans^ai<=ai,那么对于ai的话,是可以减小到ans^ai的值,然后使得所有数 的异或值为0,也即转移到了必败态. 代码如下: #include<iostream> #include<stdio.h> #include<cstring> using namespace std; ]…
题目链接 #include<iostream> #include<cstdio> using namespace std; int main() { ]; int sum,cnt; while(scanf("%d",&n)&&n) { sum=,cnt=; ;i<=n;i++) { scanf("%d",&k[i]); sum^=k[i]; } ) { printf("0\n"); c…
题目大意:尼姆博弈,求先手必胜的情况数 题目思路:判断 ans=(a[1]^a[2]--^a[n]),求ans^a[i] < a[i]的个数. #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<…
题意:已知异或和为0为必败态,异或和不为0为必胜态,问你有几种方法把开局从当前状态转为必败态. 思路:也就是说,我们要选一堆石头,然后从这堆石头拿走一些使剩下的石碓异或和为0.那么只要剩下石堆的异或和小于选中石堆的大小,那么肯定能从选中石堆中找出一定数目和剩下的石堆异或后归零. 代码: #include<queue> #include<cstring> #include<set> #include<map> #include<stack> #in…
题意:给你n堆石头,每次只能在一堆取最少一个石子,最后拿走最后一堆的为胜者,问胜者有多少种赢得取法 #include <iostream> #include<cstdio> using namespace std; int main(int argc, char** argv) { int n,stone[1010],i,t; while(scanf("%d",&n)!=EOF,n){ t=0; for(i=0;i<n;i++){ scanf(&q…
(Nim积相关资料来自论文曹钦翔<从"k倍动态减法游戏"出发探究一类组合游戏问题>) 关于Nim积计算的两个函数流程: 代码实现如下: ][]={,,,}; int Nim_Multi_Power(int x,int y) { ) return m[x][y]; ; for(;;a++) <<(<<a))&&x<(<<(<<(a+)))) break; <<(<<a); int p…