SG函数入门——【2017.5.28提高组模拟】Simple Game

2 篇文章 0 订阅
1 篇文章 0 订阅

Description:

这里写图片描述

Input:

这里写图片描述

Output:

Print the number of initial arrangements of piles that will result in Little Cat winning, modulo 10^9+7.

Sample Input:

4 3 3

Sample Output:

这里写图片描述

Data Constraint:

1<=M<=10
M<=N<=600
2<=k<=600

吹水:

又是英文题@¥!@

题目大意:

现在绝顶聪明两个人在玩一个游戏:有m个集合,总共有n个元素,两人轮流操作,每次选定一个元素个数大于1的集合,把它分成i(2 <= i <= k)个非空集合,每个集合的大小随便定,最后没得选的人判负。
要求建m个总共有n个东西的集合,且使得先手必赢,求方案数。
1 <= m <= 10, m <= n <= 600, 2 <= k <= n

题解:

博弈题。
利用sg函数,我们先求出单独一个集合是的sg值,然后动态规划拼一起就行了。

性质:
k = 2: sg(x) = 1 - x mod 2
k = 3: 暴力求。
k > 3: sg(x) = x - 1

证明:
最后一个不会,老曹说这种题的sg都要打表找规律。

这么讲肯定不懂sg的肯定还是懵。

先讲讲什么是sg。
x是一个状态,sg(x) 如果是0, 说明x这个状态先手必输,否则必赢。
sg有许多神奇的性质,实际上它的值很难解释意义。
1.x没有后继, sg(x) = 0
2.x有后继,a1,a2,a3..ak是它的后继,sg(x) = mex{sg( a1..k )}
3.x可以拆成一些互不影响的状态,如果它们分别是a1,a2..ak,sg(x) = sg(a1) xor sg(a2) xor sg(ak)

3证明现在我还不会,之后会补。

这道题中频繁用到3,好好理解就可了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值