int sg[maxn];//sg[n] n表示每堆数量
int s[k];//每次能取的值,下标从0开始,0 ~ k-1,必须有序,可以sort(s,s+k);
bool vis[maxn];
const int k;//k是集合s的大小
void get_sg()
{
int i,j;
for(i=0;i<maxn;i++)
{
memset(vis,0,sizeof(vis));
j=0;
while(j<k&&s[j]<=i)
{
vis[sg[i-s[j]]]=1;
j++;
}
for(j=0;j<maxn;j++)
if(!vis[j])
{
sg[i]=j;
break;
}
}
}
int main()
{
...
memset(sg,-1,sizeof(sg));
get_sg();
if(sg[n]==0) //先手必败
else //先手必胜
//如果有多堆,则
// num=sg[n1]^sg[n2]^sg[n3]^....^sg[nx];
// if(num==0) 则先手必败
// else 先手必胜
...
}
sg函数模板(打表)
最新推荐文章于 2025-01-18 19:39:56 发布
本文详细探讨了C++中sg函数模板的实现原理,通过实例展示了如何使用该模板进行数值计算,并讨论了其在算法和数值计算中的应用。同时,文章提供了sg函数模板的代码示例,帮助读者更好地理解和运用。
&spm=1001.2101.3001.5002&articleId=70216848&d=1&t=3&u=6149229bc4e14c65a129435351ac0096)
225

被折叠的 条评论
为什么被折叠?



