SG函数

概念及定义

必胜点和必败点的概念:
       P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。
       N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。
必胜点和必败点的性质:
        1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设)
        2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P。
        3、无论如何操作,必败点P 都只能进入 必胜点 N。

mex

首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。
例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

代码写法

//f[]为双方可采取的措施 
//sg[i],sg函数值
//s[]用于标记我可以到达的局面 
int sg[maxn],s[maxn],f[]={.....};
void getsg(int n){
	memset(sg,0,sizeof(sg));
	for(int i=1;i<=n;i++){//从小到大保证是递推的 
		memset(s,0,sizeof(s));//每次重置 
		for(int j=0;f[j]<=i&&j<11;j++)
		s[sg[i-f[j]]]=1;//我可以到达的局面是对手面临的局面
		// 对手面临的局面到达不了的局面就是我可以到达的局面
		//标记一下就好了 
		for(int j=0;;j++) if(!s[j]){
		//mex(minimal excludant)运算,这是施加于一个集合的运算,
		//表示最小的不属于这个集合的非负整数 
			sg[i]=j;
			break;
		}
	}
}

题目链接

[http://acm.hdu.edu.cn/showproblem.php?pid=1847]
[http://acm.hdu.edu.cn/showproblem.php?pid=1848]
[http://acm.hdu.edu.cn/showproblem.php?pid=3537]

posted @ 2018-11-07 15:20  ChunhaoMo  阅读(222)  评论(0)    收藏  举报