bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏 Nim游戏+SG函数
2016-12-22 21:12
363 查看
题意
有n堆石子,第i堆石子有a[i]块石头。每次只能在一堆石子中取b[j]个{1<=j<=m}问先取者是否有必胜策略,有则输出第一次在第几堆石子取多少个。
n,m<=10,a[i]<=1000
分析
第一次接触SG函数,感觉是个蛮神奇的东西。转载一点相关的文章:
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=mex{ g(y) | y是x的后继 },这里的g(x)即sg[x]
例如:取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;
以此类推…..
x 0 1 2 3 4 5 6 7 8….
sg[x] 0 1 0 1 2 3 2 0 1….
知道SG函数之后这题就变得很简单了。
首先最经典的Nim游戏是若a[1]^a[2]^…^a
!=0则先手有必胜策略,推广到这题,若sg[a[1]]^sg[a[2]]^…^sg[a
]!=0则先手有必胜策略,证明同普通的Nim游戏类似,在此略过。
最后枚举一下即可。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define N 15 using namespace std; int n,m,a ,f ,sg[1005],hash[1005]; void getsg(int n,int m) { for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) if (i-f[j]>=0) hash[sg[i-f[j]]]=i; for (int j=0;j<=i;j++) if (hash[j]!=i) { sg[i]=j; break; } } } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for (int i=1;i<=m;i++) scanf("%d",&f[i]); getsg(1000,m); int sum=0; for (int i=1;i<=n;i++) sum^=sg[a[i]]; if (!sum) { printf("NO"); return 0; } printf("YES\n"); for (int i=1;i<=n;i++) { int tmp=sg[a[i]]^sum; for (int j=1;j<=m;j++) if (a[i]-f[j]>=0) if ((tmp^sg[a[i]-f[j]])==0) { printf("%d %d",i,f[j]); return 0; } } return 0; }
相关文章推荐
- [BZOJ1874][BeiJing2009 WinterCamp]取石子游戏
- [BZOJ1874][BeiJing2009 WinterCamp]取石子游戏
- 【博弈论】【SG函数】【枚举】bzoj1874 [BeiJing2009 WinterCamp]取石子游戏
- [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
- bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 1874: [BeiJing2009 WinterCamp]取石子游戏 - BZOJ
- bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
- bzoj 1874 [BeiJing2009 WinterCamp]取石子游戏
- 【BZOJ 1874】 [BeiJing2009 WinterCamp]取石子游戏
- bzoj1874 [BeiJing2009 WinterCamp]取石子游戏 nim游戏 sg函数
- BZOJ1874: [BeiJing2009 WinterCamp]取石子游戏
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
- [BeiJing2009 WinterCamp] bzoj1874 取石子游戏 [博弈论]
- [BZOJ1874][BeiJing2009 WinterCamp]取石子游戏(博弈SG函数)
- BZOJ_P1874 [BeiJing2009 WinterCamp]取石子游戏(博弈+SG函数)
- bzoj1874: [BeiJing2009 WinterCamp]取石子游戏 组合游戏
- bzoj 1874 取石子游戏 博弈论
- BZOJ1115: [POI2009]石子游戏Kam
- BZOJ 1115: [POI2009]石子游戏Kam