poj2960 S-Nim
阿新 • • 發佈:2019-01-03
題目連結:ヾ(≧∇≦*)ゝ
題意:
Arthur and his sister Caroll玩nim遊戲玩膩了(因為他們都知道了如何計算必勝策略),所以Arthur把這個遊戲改了一下規則,Arthur定義了一個有限集合S,每次從一堆石子中取的石子數目必須在S中。
現在,Arthur想知道先手是否有必勝策略。有多組測試資料。
每組資料第一行,首先一個數K
每組資料輸出一行。每行有T個字母(“W”或“L”),第i個字母為“W”則表示第i個遊戲先手必勝,“L”表示先手必敗。
Solution:
普通Nim遊戲的升級
先預處理出sg函式,再判斷各石頭sg值異或和是否為0就行了
Code:
#include<cstdio> #include<cstring> #include<ctype.h> #include<algorithm> #define N 101 #define inf 19260817 using namespace std; int n,m,a[N],sg[N*100],vis[N*100]; void getSG(){ memset(sg,0,sizeof(sg)); for(int i=1;i<=N*100;i++){ memset(vis,0,sizeof(vis)); for(int j=1;j<=n;j++){ if (i<a[j]) break; vis[sg[i-a[j]]]=1; } for(int j=0;j<=N;j++)if(!vis[j]){sg[i]=j;break;} } } int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();} return x*f; } int main(){ begin:n=read(); if(!n)goto end; for(int i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1); getSG();m=read(); for(int i=1;i<=m;i++){ int t=read(),now=0; for(int i=1;i<=t;i++)now^=sg[read()]; if(now)printf("W");else printf("L"); } puts("");goto begin; end:return 0; }