题目描述:XHRlyb在和Cwbc玩游戏。 在一个多重集合中有在[l,r]中的全部整数各一个,即l,l+1,l+2,......,r。 每次XHRlyb和Cwbc可以选择一个大于0的数字p,把p从多重集合中删去,然后向集合中加入k个
,最后不能操作的人算输。 如果博弈双方都是绝顶聪明的,并且XHRlyb先手,请你来帮XHRlyb预测这一局游戏谁会获胜。 如果博弈双方谁也无法取胜,那么判定为平局。 聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
输入描述:
输入数据有多行,每行有三个正整数,l,r,k。
输出描述:输出数据应有多行,如果这一局XHRlyb获胜,那么请输出XHRlyb;如果Cwbc获胜,请输出Cwbc;如果两人平局,请输出Draw。
这里比较坑,容易理解错,中括号是取整的意思;我被这里阴了,改了一个晚上都改不对;
出题人写的题解:
数据组数较多,我们优先考虑预处理数组,然后直接回答询问。
考虑贪心。
当 k = 1 时,游戏会一直继续下去,谁也无法取胜,故平局。 对 2 ≤ k 的每一个 k,枚举每一个数字,考虑它需要做几次操作,才能将这个数字变成全部为零的 数字。
可以看出,最后的答案只与总操作数的奇偶性有关,而数字的总操作数是一定的,故这是一个假的
博弈论。
对操作数求一个前缀和,判断其奇偶性,即可。
这样,我们就可以通过这道题目。
考虑贪心。
当 k = 1 时,游戏会一直继续下去,谁也无法取胜,故平局。 对 2 ≤ k 的每一个 k,枚举每一个数字,考虑它需要做几次操作,才能将这个数字变成全部为零的 数字。
可以看出,最后的答案只与总操作数的奇偶性有关,而数字的总操作数是一定的,故这是一个假的
博弈论。
对操作数求一个前缀和,判断其奇偶性,即可。
这样,我们就可以通过这道题目。
#include<bits/stdc++.h>
using namespace std;
long long pk[105][100005];
void solve()//预处理,求出对于每个k值,每个p需要的操作数
{
long long k,p,s,num;
for(k=2;k<=100;k++)
{
for(p=1;p<=100000;p++)
{
s=p;
while(s)
{
s/=k;
pk[k][p]=pk[k][p]*k+1;
}
}
}
}
int main()
{
long long l,r,k,i,j;
solve();
while(~scanf("%lld%lld%lld",&l,&r,&k))
{
long long ans=0;
if(k==1)
{
printf("Draw\n");
}
else
{
for(i=l;i<=r;i++)
{
ans=ans+pk[k][i];
}
if(ans%2==1)
printf("XHRlyb\n");
else
printf("Cwbc\n");
}
}
}