牛客小白月赛3 C.博弈

牛客小白月赛3 C.博弈

题目链接

题目描述

XHRlyb 在和 Cwbc 玩游戏。
在一个多重集合中有在 [l,r] 中的全部整数各一个,即 l , l + 1 , l + 2 , . . . . . . , r l,l+1,l+2,......,r ll+1l+2......r
每次 XHRlyb 和 Cwbc 可以选择一个大于0的数字p,把p从多重集合中删去,然后向集合中加入 k k k ⌊ p k ⌋ \lfloor \frac{p}{k} \rfloor kp,最后不能操作的人算输。
如果博弈双方都是绝顶聪明的,并且 XHRlyb 先手,请你来帮 XHRlyb 预测这一局游戏谁会获胜。
如果博弈双方谁也无法取胜,那么判定为平局。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多行,每行有三个正整数,l,r,k。

输出描述:

输出数据应有多行,如果这一局 XHRlyb 获胜,那么请输出 XHRlyb;如果 Cwbc 获胜,请输出 Cwbc;如果两人平局,请输出 Draw。

示例1

输入

1 3 2

输出

XHRlyb

示例2

输入

1 4 2

输出

Cwbc

首先 k = 1 k=1 k=1 肯定是无限循环下去的,输出平局
判断一个数变为 0 0 0 需要多少步,然后求 [ l , r ] [l,r] [l,r] 的前缀和判断奇偶性即可,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=1e5+5;
int l,r,k,num[N][101];
int f(int x,int y){
    int ans=0,cnt=1;
    while(x){
        ans+=cnt;
        cnt*=y;
        x/=y;
    }
    return ans;
}

void init(){
    for(int i=2;i<=100;i++){
        for(int j=1;j<N;j++){
            num[j][i]=f(j,i)+num[j-1][i];
        }
    }
}

int main()
{
    init();
    while(~scanf("%d%d%d",&l,&r,&k)){
        if(k==1) printf("Draw\n");
        else if((num[r][k]-num[l-1][k])%2==0) printf("XHRlyb\n");
        else printf("Cwbc\n");
    }
}

你可能感兴趣的:(前后缀和,牛客)