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. windows程序设计.第一个windos程序

    Windows程序设计(第5版) windows程序需要调用API. 第一个Windows程序 /*HelloMsg.c -- Displays "Hello World!" in ...

  2. bootstrap带图标的按钮与图标做连接

    bootstrap通过引入bootstrap的JS与css文件,给元素添加class属性即可. 使用图标只需要加入一个span,class属性设置为对应的图标属性即可.图标对应的class属性可以参考 ...

  3. python多线程下载文件

    从文件中读取图片url和名称,将url中的文件下载下来.文件中每一行包含一个url和文件名,用制表符隔开. 1.使用requests请求url并下载文件 def download(img_url, i ...

  4. HDU 1079 Calendar Game(博弈找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1079 题目大意:给你一个日期(包含年月日),这里我表示成year,month,day,两人轮流操作,每 ...

  5. 以太坊go-ethereum客户端docker安装(一)

    最近一段时间忙于工作,就没来得及发表博客,但一直没有停止对区块链的研究.周末抽时间分享一下近期比较重大的收获之一--使用docker来搭建和使用以太坊的节点.本人已经顺利搭建出,开发环境,测试环境,F ...

  6. 7. Docker Compose 项目

  7. First Missing Positive——数学类

    转:http://blog.csdn.net/nanjunxiao/article/details/12973173 Given an unsorted integer array, find the ...

  8. java-list-分组

    Map<String, List<Hb12Domain>> groupBy = hb18DomainList.stream().collect(Collectors.group ...

  9. appium+python自动化39-adb shell输入中文(ADBKeyBoard)

    前言 上一篇提到"adb shell input textyoyo" 可以通过adb 输入英文的文本,由于不支持unicode编码,所以无法输入中文,github上有个国外的大神写 ...

  10. IEEEXtreme 10.0 - Checkers Challenge

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...