可以试一下,
m为偶数的时候,sg[m]只有0/1两种可能,这个序列是0,1,0,1,0,1…
但m为奇数的时候就不同了 sg(0)=0,sg(1)=1,sg(2)=0,sg(3)=1,sg(4)=2,sg(5)=0,sg(6)=2,… 当 n为奇数的时候答案为0,n为偶数的时候答案为mex(0,sg(k))(k>2)
答案为n堆的时候,把sg^起来就行了
但这道题还有很多疑点:
- 最大值和最小值问题可不可以用二分答案?
- 有没有贪心策略?否则能不能dp?
写代码的时候还要注意
- 是否要开LongLong
- 数组边界
- 实数精度
- 特殊情况
这些都是我之前错的地方
#include<bits/stdc++.h>
using namespace std;
const int a[]={0,1,0,1,2};
int n,m,ans,x;
int sg(int x)
{
if(m&1)
{
if(x<5)
return a[x];
if(x&1)
return 0;
return sg(x/2)==1?2:1;
}
else
{
if(x<=2)
return x;
return(x&1)?0:1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
ans^=sg(x);
}
if(ans)
cout<<"YJC";
else
cout<<"CJY";
}