http://acm.hdu.edu.cn/showproblem.php?pid=3404 题目

http://www.doc88.com/p-5098170314707.html 论文 nim积在22页附近

http://blog.csdn.net/kele52he/article/details/77099890 抄的代码的来源

根据论文相关部分和自己的理解的介绍。(nim积其实没什么卵用,学这种毒瘤的都有猫病。)

nim和其实就是异或,想一下之前sg函数或者nim游戏结算的时候,是几堆在一起玩的,异或之后就是这几堆游戏的nim和。

想一个二维翻硬币游戏,给出正面朝上的硬币的坐标,每次翻两个同排或同列的硬币,其中坐标较大的翻之前必须正面朝上,没法操作的为输。坐标从0开始。

那么每个位置的sg函数就相当于横纵坐标的nim和,因为每个位置的硬币相当于两个博弈游戏放在一起玩。这个sg函数的计算方式称作x⊕y。

再想另一个规则的二维翻硬币游戏,给出正面朝上的硬币的坐标,每次必须同时翻四个能作为同一个矩形的四个顶点的硬币,其中列数和排数最大的硬币必须为正面朝上,没法操作的为输。坐标从0开始。(这就是hdu3404的题意)

那么这次的sg函数就较为复杂,我们把位置(x,y)的的sg函数称为xⓧy。

ⓧ操作有如下规则。

1.单位元: xⓧ1=1ⓧx=x;  2.交换律: xⓧy=yⓧx;

3.结合律: (xⓧy)ⓧz=(xⓧy)ⓧz;  4.对异或的分配率: (x⊕y)ⓧz=(xⓧz)⊕(yⓧz).

ⓧ的基本运算性质: 对于x,y<2^(2^a)

1.xⓧ( 2^(2^a) ) = ( 2^(2^a) )*x;

2.xⓧy < ( 2^(2^a) );

3.( 2^(2^a) ) ⓧ( 2^(2^a) )=3/2* ( 2^(2^a) ).

根据这些基本性质,我们可以得出一个递归求nim积的板子,这里放上这道题的代码。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<ctime>
using namespace std;
int n;
int sg[][]={};
int f(int,int);
int g(int x,int y){
if(sg[x][y]!=-)return sg[x][y];
if(!x)return sg[x][y]=<<y;
if(!y)return sg[x][y]=<<x;
int ans=,k=,t;
int x1=x,y1=y;
while(x||y){
t=<<k;
if((x^y)&){
ans*=t;
}
x>>=;y>>=;k<<=;
}
k=;x=x1;y=y1;
while(x||y){
t=<<k;
if((x&y)&){
ans=f(ans,t/*);
}
x>>=;y>>=;k<<=;
}return sg[x1][y1]=ans;
}
int f(int x,int y){
if(!x||!y)return ;
if(x==)return y;
if(y==)return x;
int ans=;
for(int i=x,a=;i;i>>=,a++){
if(!(i&))continue;
for(int j=y,b=;j;j>>=,b++){
if(!(j&))continue;
ans^=g(a,b);
}
}return ans;
}
int main(){
int T;scanf("%d",&T);
memset(sg,-,sizeof(sg));
while(T-->){
scanf("%d",&n);
int ans=,x,y;
for(int i=;i<=n;i++){
scanf("%d%d",&x,&y);
ans^=f(x,y);
}
if(ans)printf("Have a try, lxhgww.\n");
else printf("Don't waste your time.\n");
}
return ;
}

HDU 3404 Switch lights 博弈论 nim积的更多相关文章

  1. HDU 3404 Switch lights(Nim积)题解

    题意:在一个二维平面中,有n个灯亮着并告诉你坐标,每回合需要找到一个矩形,这个矩形xy坐标最大的那个角落的点必须是亮着的灯,然后我们把四个角落的灯状态反转,不能操作为败 思路:二维Nim积,看不懂啊, ...

  2. hdu 3404 Switch lights 博弈论

    主要是求NIM积!!! 代码如下: #include<iostream> #include<cstdio> #include<stack> #include< ...

  3. POJ 3553 Light Switching Game 博弈论 nim积 sg函数

    http://poj.org/problem?id=3533 变成三维的nim积..前面hdu那个算二维nim积的题的函数都不用改,多nim积一次就过了...longlong似乎不必要但是还是加上了 ...

  4. HDU 3404&POJ 3533 Nim积(二维&三维)

    (Nim积相关资料来自论文曹钦翔<从"k倍动态减法游戏"出发探究一类组合游戏问题>) 关于Nim积计算的两个函数流程: 代码实现如下: ][]={,,,}; int N ...

  5. Nim积解法小结

    由于某毒瘤出题人 redbag 不得不学习一下这个史诗毒瘤算法. 本文参考了 Owaski 的 GameTheory 的课件. 定义 我们对于一些二维 \(\mathrm{Nim}\) 游戏(好像更高 ...

  6. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  7. POJ 3533 Light Switching Game(三维Nim积)题解

    思路:三维Nim积 代码: #include<set> #include<map> #include<stack> #include<cmath> #i ...

  8. HDU.2149 Public Sale (博弈论 巴什博弈)

    HDU.2149 Public Sale (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 #include <bits/stdc++.h> using namesp ...

  9. HDU.1846 Brave Game (博弈论 巴什博弈)

    HDU.1846 Brave Game (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 include <bits/stdc++.h> using namespac ...

随机推荐

  1. parseInt

    本文地址:http://www.cnblogs.com/veinyin/p/7647863.html 先来个简单的 console.log(parseFloat("8")); 嗯, ...

  2. POJ 3734 Blocks (矩阵快速幂)

    题目链接 Description Panda has received an assignment of painting a line of blocks. Since Panda is such ...

  3. 59、有用过with statement吗?它的好处是什么?

    python中的with语句是用来干嘛的?有什么作用? with语句的作用是通过某种方式简化异常处理,它是所谓的上下文管理器的一种 用法举例如下: with open('output.txt', 'w ...

  4. eclipse加速/Nginx配置跨域代理

    下班时间到啦! --下班都是他们的,而我,还是什么都没有. eclipse加速 去掉包含js文件的包的js验证,否则每次启动都需要进行校验(右击项目->properties) Nginx配置跨域 ...

  5. 离散化&&逆序数对

    题目:http://www.fjutacm.com/Problem.jsp?pid=3087 #include<stdio.h> #include<string.h> #inc ...

  6. CRF++模板使用(转)

    CRF++模板构建分为两类,一类是Unigram标注,一类是Bigram标注. Unigram和Bigram模板分别生成CRF的状态特征函数  和转移特征函数  .其中  是标签,  是观测序列,   ...

  7. php中的转义函数

    <?php parse_url 解析URL, 返回各组成部分 urlencode/urldecode url编码/解码 htmlentities 将字符串转化为html实体 htmlentiti ...

  8. Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f070058 android-studio 3.0 from canary 5 to canary 6

    我升级android-studio到了3.0 canary 6打包编译安装出现如下错误: 07-11 13:00:39.523 8913-8913/dcpl.com.myapplication E/A ...

  9. git配置用户名跟邮箱

    因为我有两个git账号 所以我现在要改变我的默认用户名跟邮件 我就需要去终端设置用户名跟邮箱 具体的命令行就是 设置git的用户名 git config --global user.name &quo ...

  10. DB2和Oracle中Date比较