题意
人机大战轮流给
P(x) = anxn + an − 1xn − 1 + ⋯ + a1x + a0
里面的未知的 ai 填数字,使得填好之后的数字能够整除
x−k
k 是给出的。问是否一定能做到
题解
此题思想巧妙。。
有两种理解方法:
一、脑补:
两个多项式可以相除,那么
二、科学:
r=an⋅kn+an−1∗kn−1+⋯+a1∗k+a0
(参见 多项式长除法-维基百科)把它变为 0
解法:
如果
a0
为
0
必胜,否则当前先手必胜
如果
若已填满,最后一手必胜
否则
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;
}