转自别人的题解:(x-k)|P(x)等价于P(k)==0
分两种情况考虑
如果k=0的话,谁先使得a[0]=0就好了
如果k!=0的话,注意到每一步都可以任意改变P(k)的值,因此只有最后一步是有用的,如果所有数都已经确定,那么检查P(k)是否为0,否则胜负取决于最后一步操作的先手。
#include<bits\stdc++.h>
using namespace std;
const int maxn = 1e5+6;
#define LL long long
#define INF 0x3f3f3f3f
int a[maxn],cnt,n,k;
string s;
int main()
{
scanf("%d%d",&n,&k);
n++;
for(int i = 0;i<n;i++)
{
cin >> s;
if (s[0]=='?')
a[i]=INF;
else
{
int p = 0;
if (s[0]=='-')
p=1;
for(int j = p;j<s.size();j++)
a[i] = a[i]*10+(int)(s[j]-'0');
if(s[0]=='-')
a[i]=a[i]*(-1);
cnt++;
}
}
if(k==0)
{
if(a[0]==INF)
{
if(cnt %2 == 1)
puts("Yes");
else
puts("No");
}
else if (a[0])
puts("No");
else
puts("Yes");
}
else
{
if(cnt < n)
{
if(n%2==1)
puts("No");
else
puts("Yes");
}
else
{
LL now = 0;
for(int i = n-1;i>=0&&abs(now)<1e14;i--)
{
now = 1LL *now*k+a[i];
}
printf("%s\n",(now?"No":"Yes"));
}
}
}