POJ 2975 Nim (Nim的证明)
来源:互联网 发布:js获取标签属性 编辑:程序博客网 时间:2024/06/07 00:32
题意:给定一种Nim状态(相当于含N堆石头),求能有几种方法能通过调整某一堆石头的状态(只准取出),使新的Nim状态为必败态。(或者说求出所给的Nim游戏状态有多少种方法能够赢)
思路:Nim结论的应用
在证明Nim游戏的SG函数的“根据这个判断被判为N-position的局面一定可以移动到某个P-position”命题时,有这么一段证明:对于某个局面(a1,a2,...,an),若a1^a2^...^an不为0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。不妨设a1^a2^...^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^k<ai一定成立。则我们可以将ai改变成ai'=ai^k,此时a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。
对任意的当前状态S,只需将某堆石头a[i]变为S^a[i]即可使得整个局面的SG值为0,即变为必败态。
#include <iostream>#include <queue>#include <cstdio>#include <cstring>#include <cmath>using namespace std;int main(){ int n; while(scanf("%d",&n)==1&&n!=0) { int a[1010],sum=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum=sum^a[i]; } int ans=0; for(int i=1;i<=n;i++) if((sum^a[i])<a[i])//注意^与<的优先级 ans++; printf("%d\n",ans); } return 0;}
阅读全文
0 0
- POJ 2975 Nim (Nim的证明)
- 经典的NIM-poj-2975-Nim
- POJ 2975 Nim <Nim 博弈>
- POJ 题目2975 Nim(nim)
- POJ 2975 Nim(nim博弈)
- POJ-2975-Nim(Nim博弈)
- [POJ](2975)Nim ---Nim博弈(博弈)
- POJ-2975-Nim
- poj 2975 Nim 水
- POJ 2975 Nim
- POJ Nim (2975)
- poj 2975 Nim
- POJ 2975 Nim题解
- 【POJ 2975】 Nim 博弈论
- poj 2975 Nim
- poj 2975 Nim(博弈)
- poj 2975 NIM
- POJ 2975 Nim 题解
- 什么是Servlet容器?
- OpenJudge 6179-角谷猜想
- PHP基础之常量
- Javascript权威指南学习笔记1:第一章
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- POJ 2975 Nim (Nim的证明)
- jsp使用sessionScope获取session值
- 数据结构实验之查找七:线性之哈希表
- GitHub入门——概述
- Codeforces Round #428 (Div. 2) B. Game of the Rows
- 添加自己的package
- HTTP协议详解
- zbar的安装,按照这个安装的
- 编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程