TheDivisionGame
作者:陆宇暄
关键词:博弈论 sg函数
题目简述
按如下方式定义一个游戏: 给定,(),定义可重数集.定义一次操作为选中数集中的某个数然后把它变成一个不等于他自己的因数.两个玩家轮流操作,没有合法操作(即中所有数都是)的玩家失败. 题目给定两个数和,问有多少种满足和定义的游戏先手必胜.
保证,.
分析
观察该游戏,发现数集中的每个数都是独立的nim问题,所以考虑计算每个数的sg函数.
引理:这个游戏的任意一个数的sg值都是它的可重复质因数数量.
例: <--->
证明:
由于这个数为1时先手必败,所以. 当该引理对所有有个质因数的数成立时: 考虑有个质因数的数必然有质因数数量为到的因子,且一定不会有质因数数量为的因子,根据sg函数的定义,. 所以该引理对所有有个质因数的数成立 得证!
算法
既然不是很好统计先手必胜的情况,那就统计后手必胜即sg函数和为的情况数.
假设我们已经求出的中的所有数的sg值,由于运算的自反性,所以可以直接用一个计数数组统计出答案.
long long ans=0;num[0]=1;int sg=0;
for (int i=l;i<=r;i++)
{
sg^=fac[i-l];
ans+=num[sg];
num[sg]++;
}
所以现在的问题就是如何求出中的所有数的质因数个数.这是一个经典(划掉)问题.一个简单的方法就是用以内的质数筛一遍就好了.
时间复杂度: