[Codeforces Round #354 DIV2E (CF676E)] The Last Fight Between Human and AI

题意

人机大战轮流给

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

里面的未知的 ai 填数字,使得填好之后的数字能够整除
xk

k 是给出的。问是否一定能做到

题解

此题思想巧妙。。
有两种理解方法:
一、脑补:
  两个多项式可以相除,那么xk=0 P(x) 也为 0
二、科学:
  P(x)/(xk)余数长得这样子

r=ankn+an1kn1++a1k+a0

  (参见 多项式长除法-维基百科)把它变为 0

解法:
 如果k=0
   a0 0 必胜,否则当前先手必胜
 如果k0
  若已填满,最后一手必胜
  否则 P(k)=0 必胜

代码

/// by ztx
#include <bits/stdc++.h>

int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
if (CH == '?') {
    ret = 66666;
    return;
}
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}

#define  maxn  100010LL

int a[maxn];

int main() {
    int n, K, i, unknow(0);
    double ans;
    scanf("%d%d", &n, &K);
    for (i = 0; i <= n; i ++ )
        if (read(a[i]), a[i] == 66666)
            unknow ++ ;
    if (K == 0) {
        if (a[0] == 0) puts("Yes");
        else if (a[0] == 66666) {
            if ((n+1-unknow) & 1) puts("Yes");
            else puts("No");
        } else puts("No");
    } else {
        if (unknow) {
            if ((n+1)&1) puts("No");
            else puts("Yes");
        } else {
            ans = 0;
            for (i = n; ~i; i -- ) {
                ans = ans * K + a[i];
            }
            if (ans == 0) puts("Yes");
            else puts("No");
        }
    }
    getchar(),getchar();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值