sg函数模板(打表)

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;i0,sizeof(vis));
        j=0;
        while(j1;
        j++;
        }
        for(j=0;jif(!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    先手必胜
    ...
}

你可能感兴趣的:(一些算法&&数据结构&&数论)