[数学] codeforces 676E. The Last Fight Between Human and AI

题意:
一开始有一个多项式

P(x)=anxn+an1xn1++a1x+a0

系数未知,人和电脑轮流最优确定一个系数,问最后能不能使 P(x)=B(x)Q(x) 成立,成立人就赢了,否则电脑赢,电脑先走。
其中 Q(x)=xk k 是已知常数。
输入不一定会给出初始局面,也可能给出进行了几次之后的局面,所以给出的局面可能是该人走,也可能该电脑走,已知的系数是整数,未知的系数可以填任意实数。
题解:
由于要满足P(x)=B(x)Q(x),先手算一下任意情况下的多项式除法,用 P(x) 除以 Q(x) ,算出余数大概长这样:
J=ankn+an1kn1++a1k+a0

问题转变成让余数 J 为0。
所以要考虑两种情况:
k=0,那么必须要让 a0=0 ,根据 a0 是否已知,当前该谁先走,讨论一下就行了。
k!=0 ,如果有系数没有确定, 因为 ai 可以取任意值,容易看出最后走的人必胜,如果全部系数都确定了,只需要判断 J=0 ,由于 n 可能会很大,只能考虑取余,如果J=0,那么对任意数取余都还是 0 <script type="math/tex" id="MathJax-Element-54">0</script>,因此随机一系列数进行检验就行了,要注意的是只选1e9+7和1e9+9的话是不行的,有针对数据。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
const ll mod = 1e9+7;
int a[N], n, k;
char s[10];
bool issur[N];
int get(char *s){
    int flag = 1, res = 0;
    if(s[0] == '-') flag = -1;
    else res = s[0]-'0';
    for(int i = 1; s[i]; ++i){
        res = res*10+s[i]-'0';
    }
    return flag*res;
}
bool cal(ll mod){
    ll res = 0;
    for(int i = n; i >= 0; --i){
        res = res*k%mod+a[i];
        res %= mod;
    }
    return res;
}
int main(){
    int flag = 0, sur = 0, hf = 0;
    scanf("%d%d", &n, &k);
    for(int i = 0; i <= n; ++i){
        scanf("%s", s);
        if(s[0] == '?') ++flag;
        else a[i] = get(s), sur++, issur[i] = 1, hf = !hf;
    }
    if(k == 0){
        if(!issur[0]) puts(hf? "Yes" : "No");
        else puts(a[0]? "No" : "Yes");
        return 0;
    }
    if(flag){
        if(flag%2 != sur%2) puts("No");
        else puts("Yes");
    }
    else{
        for(int i = 0; i < 100; ++i){
            if(cal((ll)rand()*11234ll*5135ll*15ll%mod)){ puts("No"); return 0; }
        }
        puts("Yes");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值