题意 给你 n堆石子 俩个人对于每堆石子只能取p的非负整数幂 个,对于某个人无法操作则就输了
算法:sg函数打表分析
sg函数代码
int sg(int x) {
if(f[x]!=-1) {
return f[x];
}
set<int>s;
for(int i=0; i<10; i++) {
if(x>=pow(p,i)) {
s.insert(sg(x-pow(p,i)));
}
}
for(int i=0;; i++) {
if(!s.count(i)) {
return f[x]=i;
}
}
}
本题代码
# include <bits/stdc++.h>
using namespace std;
# define int long long
int n,p;
const int N=1e6;
int a[N];
signed main() {
cin>>n>>p;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
int ans=0;
int x;
for(int i=1; i<=n; i++) {
if(p%2!=0) {
if(a[i]%2==0) {
x=0;
} else {
x=1;
}
} else {
if(a[i]<p&&a[i]%2==0) {
x=0;
} else if(a[i]<p&&a[i]%2!=0) {
x=1;
} else if(a[i]==p) {
x=2;
} else {
int d=a[i]%(p+1);
if(d<p&&d%2==0) {
x=0;
} else if(d<p) {
x=1;
} else {
x=2;
}
}
}
ans^=x;
}
if(ans!=0)
{
cout<<"GOOD"<<endl;
}
else
{
cout<<"BAD"<<endl;
}
}