poj 2975

来源:互联网 发布:珠宝设计软件下载 编辑:程序博客网 时间:2024/06/05 08:40

题目概述:

尼姆游戏,最后一次取的获胜

有N堆,每堆有num个,每次从一堆中取至少一个

输入:

第一行N,下一行N个数,为num,数据有多组,以N=0为止(不处理)

限制:

1<=N<=1000;1<=num<=1e9

输出:

每行一个整数,首次取时可由s态转到t态的取法种数,如果取前已经是t态则种数为0

多组输出之间没有空行

样例输入:

3
7 11 13
2
1000000000 1000000000
0

样例输出:

3
0

讨论:

用所有堆异或后的结果去异或单一堆即是按必胜取法取后该堆剩余数,因此如果大于等于原有的则对该堆不存在必胜取法

题解状态:

168K,32MS,C++,557B

#include<algorithm>#include<string.h>using namespace std;#define INF 0x3f3f3f3f#define maxx(a,b) ((a)>(b)?(a):(b))#define minn(a,b) ((a)<(b)?(a):(b))#define MAXN 1007int nums[MAXN];inline int fun(int N){int ans = 0;for (int p = 0; p < N; p++) {scanf("%d", &nums[p]);//inputans ^= nums[p];//顺手异或一番}int cnt = 0;while (N--)if ((ans^nums[N]) < nums[N])//左侧异或的结果是遵从必胜取法后该堆剩余数量,如果大于等于原有数量显然是不可能的cnt++;return cnt;}int main(void){//freopen("vs_cin.txt", "r", stdin);//freopen("vs_cout.txt", "w", stdout);int N;while (~scanf("%d", &N) && N)//inputprintf("%d\n", fun(N));//output}

EOF

0 0
原创粉丝点击