编程语言
首页 > 编程语言> > 牛客 博弈(预处理+秦九韶算法)

牛客 博弈(预处理+秦九韶算法)

作者:互联网

当所有的数字全部变为0时,下一个进行操作的人将无路可走,所以本题的关键在于:

如果k=1,那么比赛永无止境,结果为平局;如果k>1,计算出让所有数字变为0的总共的操作数,根据奇偶性判断,奇数先手胜,偶数后手胜。

由于数据组数过多,我们选择预处理数组。对于[1, 1e+5]中每一个可能的整数p,[1, 100]中每一个可能的整数k,进行p/k操作,求使p变为0的操作数(根据题意,每一次从集合中删除p时,将增添k个$\lfloor p/k \rfloor$)。

上述操作本质上为求一个深度为$\lceil p/k \rceil$的满k叉树节点数,亦即等比数列求和:$k^{0}+k^{1}+k^{2}+...+k^{n-1}$

我们考虑使用秦九韶算法(霍纳法则):先乘以k再加1

代码:

#include <bits/stdc++.h>
using namespace std;

int l, r, k;
int kp[105][100005];
void pre()
{
    for(int k=2;k<=100;++k){
        for(int p=1;p<=100000;++p){
            int temp=p;
            while(temp){
                temp/=k;
                kp[k][p]=kp[k][p]*k+1;//秦九韶算法,On实现一元n次多项式计算
            }
        }
    }
}
int main()
{
    pre();
    while(cin>>l>>r>>k){
        if(k==1) {cout<<"Draw"<<endl;continue;}
        int ans=0;
        for(int i=l;i<=r;++i)
            ans+=kp[k][i];
        if(ans%2) cout<<"XHRlyb"<<endl;
        else cout<<"Cwbc"<<endl;
    }
    return 0;
}

 

标签:操作数,int,变为,牛客,算法,秦九韶,预处理
来源: https://www.cnblogs.com/ChenyangXu/p/10719532.html