poj 2975 Nim

来源:互联网 发布:linux进入目录的命令 编辑:程序博客网 时间:2024/05/21 13:21

Nim
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5284 Accepted: 2470

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 more stones from any single pile. Play ends when all the stones have been removed, at which point the last player to have moved is declared the winner. Given a position in Nim, your task is to determine how many winning moves there are in that position.

A position in Nim is called “losing” if the first player to move from that position would lose if both sides played perfectly. A “winning move,” then, is a move that leaves the game in a losing position. There is a famous theorem that classifies all losing positions. Suppose a Nim position contains n piles having k1k2, …, kn stones respectively; in such a position, there are k1 + k2 + … + kn possible moves. We write each ki in binary (base 2). Then, the Nim position is losing if and only if, among all the ki’s, there are an even number of 1’s in each digit position. In other words, the Nim position is losing if and only if the xorof the ki’s is 0.

Consider the position with three piles given by k1 = 7, k2 = 11, and k3 = 13. In binary, these values are as follows:

 11110111101 

There are an odd number of 1’s among the rightmost digits, so this position is not losing. However, suppose k3 were changed to be 12. Then, there would be exactly two 1’s in each digit position, and thus, the Nim position would become losing. Since a winning move is any move that leaves the game in a losing position, it follows that removing one stone from the third pile is a winning move when k1 = 7, k2 = 11, and k3 = 13. In fact, there are exactly three winning moves from this position: namely removing one stone from any of the three piles.

Input

The input test file will contain multiple test cases, each of which begins with a line indicating the number of piles, 1 ≤ n ≤ 1000. On the next line, there are n positive integers, 1 ≤ ki ≤ 1, 000, 000, 000, indicating the number of stones in each pile. The end-of-file is marked by a test case with n = 0 and should not be processed.

Output

For each test case, write a single line with an integer indicating the number of winning moves from the given Nim position.

Sample Input

37 11 1321000000000 10000000000

Sample Output

30

Source

Stanford Local 2005

题解:具体分析过程参见nim游戏的证明。


#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[11000],n,k;int main(){  scanf("%d",&n);  while (n!=0)   {    memset(a,0,sizeof(a));    for (int i=1;i<=n;i++)     scanf("%d",&a[i]);    k=a[1];    for (int i=2;i<=n;i++)     k^=a[i];    int ans=0;    for (int i=1;i<=n;i++)     if ((a[i]^k)<a[i])      ans++;    printf("%d\n",ans);    scanf("%d",&n);   }}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 饿了么商家钱包提现被锁了怎么办 在淘手游买的游戏账号被找回怎么办 交易猫买手游梦幻号被找回了怎么办 绑定着苹果账号的邮箱忘记了怎么办 京东注册账号跟密码都忘记了怎么办 孩子大学一个宿舍宿友不行怎么办 微信手机支付密码忘记了怎么办 微信公众号不能付款了怎么办 头条误点了投放头条广告怎么办 交行网银密码错误6次怎么办 宁波新冮厦关门我们的消费卡怎么办 第一天上班别人教的学不会怎么办 老公出轨已经不想跟你爱爱了怎么办 妻子出轨丈夫为了孩子不离婚怎么办 妻子出轨分居死也不愿意离婚怎么办 拼多多个人卖家登录密码忘了怎么办 微信被限制添加更多订阅号了怎么办 知网复制粘贴的论文有格式怎么办 知网论文查询网站密码忘记了怎么办 开通了超级会员不能克隆好友怎么办 偷了家里好多钱去买手机了怎么办 中行信用卡短信邀请办白金卡怎么办 注册邮箱说邮箱地址已被注册怎么办 便利店开在小区里面没生意怎么办 微信支付密码忘了怎么办没银行卡 中行5月扣很多钱是怎么办 中银淘宝校园卡影响征信问题怎么办 中银E盾快到期了怎么办 京东e卡电子卡卡密泄漏怎么办 买错了京东e卡怎么办 京东购买手机激活后有问题怎么办 优购m9锁屏密码忘记了怎么办视频 中百仓储的购物卡过期了怎么办 武汉中百超市购物卡过期怎么办 已认证抵扣的发票发生退货怎么办 京东白条分期买手机额度不够怎么办 京东白条闪付手机不支持开通怎么办 拼多多不小心下两次单付款了怎么办 不小心给了京东快递差评怎么办 京东金融不小心卸载了怎么办 如果京东快递不小心完成订单怎么办