題意:
一開始有一個多項式
係數未知,人和電腦輪流最優確定一個係數,問最後能不能使
其中
輸入不一定會給出初始局面,也可能給出進行了幾次之後的局面,所以給出的局面可能是該人走,也可能該電腦走,已知的係數是整數,未知的係數可以填任意實數。
題解:
由於要滿足
問題轉變成讓餘數
所以要考慮兩種情況:
當
當
#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");
}
}