[BeiJing2009 WinterCamp]取石子游戏 Nim SG 函数

Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1003
int arr[13],step[13],SG[maxn];
bool vis[maxn];
int main(){
    //freopen("input.in","r",stdin);
    int n,m,MAX=0,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&arr[i]), MAX=max(MAX,arr[i]);
    scanf("%d",&m);
    for(int i=1;i<=m;++i) scanf("%d",&step[i]);
    SG[0]=0;
    for(int i=1;i<=1000;++i) {
        memset(vis,0,sizeof(vis));
        for(int j=1;j<=m&&step[j]<=i;++j) vis[SG[i-step[j]]]=1;      
        for(int j=0;;++j)
            if(!vis[j]){
                SG[i]=j;
                break;
            }
    }
    for(int i=1;i<=n;++i) ans^=SG[arr[i]];
    if(ans==0)printf("NO");
    else printf("YES
");
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m&&step[j]<=arr[i];++j)
            if((ans^SG[arr[i]])==SG[arr[i]-step[j]]) {
                printf("%d %d",i,step[j]);
                return 0;
            }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/9912549.html