SG函数

来源:互联网 发布:java工厂模式的好处 编辑:程序博客网 时间:2024/05/07 05:00


SG函数百科:http://baike.baidu.com/link?url=Vt-iHB1mDWQgtKW680nFtFeQ4-H1iVdE3I07hrkJTUuqssgcArTVOLVZtD0y_smWX26Fq_I45k1XKxOfNa1-5a

SG函数模板:http://www.cnblogs.com/frog112111/p/3199780.html


hdu 1848:

#include<cstdio>#include<cstring>#include<stdlib.h>#include<algorithm>#include<iostream>#include<math.h>using namespace std;#define ll long longint s[20];int g[1010];int G(int x){int mex[18]={0};if(g[x]!=-1) return g[x];if(x-s[0]<0) return g[x]=0;for(int i=0;i<20&&(x-s[i]>=0);i++){mex[G(x-s[i])]=1;}for(int i=0;;i++)if(mex[i]==0)return g[x]=i;}int main(){int n,m,p;int i,j,k;s[0]=s[1]=1;for(i=2;i<=16;i++)s[i]=s[i-1]+s[i-2];memset(g,-1,sizeof(g));while(scanf("%d%d%d",&n,&m,&p)){if(n==0&&m==0&&p==0) break;int ans=G(n)^G(m)^G(p);if(ans==0) printf("Nacci\n");else printf("Fibo\n");}}

hdu 1536:

#include<cstdio>#include<cstring>#include<stdlib.h>#include<algorithm>#include<iostream>#include<math.h>using namespace std;#define ll long longint s[110];int g[10010];int k;int G(int x){int mex[110]={0};if(g[x]!=-1) return g[x];if(x-s[0]<0) return g[x]=0;for(int i=0;i<k&&(x-s[i]>=0);i++){mex[G(x-s[i])]=1;}for(int i=0;;i++)if(mex[i]==0)return g[x]=i;}int main(){int i,j,n,m;while(scanf("%d",&k),k){for(i=0;i<k;i++)scanf("%d",&s[i]);sort(s,s+k);memset(g,-1,sizeof(g));scanf("%d",&m);while(m--){scanf("%d",&n);int ans=0;while(n--){scanf("%d",&j);ans^=G(j);}if(ans==0) printf("L");else printf("W");}printf("\n");}}

hdu 1524:

#include<cstdio>#include<cstring>#include<stdlib.h>#include<algorithm>#include<iostream>#include<math.h>#include<vector>using namespace std;#define ll long longint g[1010];vector<int> f[1010]; int G(int x){int mex[12]={0};if(g[x]!=-1) return g[x];int len=f[x].size();if(len==0) return g[x]=0;for(int i=0;i<len;i++){mex[G(f[x][i])]=1;}for(int i=0;;i++)if(mex[i]==0)return g[x]=i;}int main(){int n,m;int i,j,k;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){f[i].clear();g[i]=-1;}for(i=0;i<n;i++){scanf("%d",&k);while(k--){scanf("%d",&j);f[i].push_back(j);}}while(scanf("%d",&m),m){int ans=0;while(m--){scanf("%d",&k);ans^=G(k);}if(ans==0) printf("LOSE\n");else printf("WIN\n");}}}


0 0
原创粉丝点击