一本通OJ-魔法珠
魔法珠
题意
SG函数:首先得到\(x\)的因数,然后获得到他们的\(SG\)值,作为他们的子游戏的\(SG\)值异或起来,当这个值异或其中一个\(SG\)值时,根据异或的性质,可以得到除了他以外的\(SG\)值。而后我们使用\(map\)记录他们可到的状态,而后从\(0\)到\(cnt\)枚举最小的\(mex\)记它为\(SG[x]=mex\)。
分析
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
int SG[N];
int _SG(int x){
if(x==1&&x==0) return 0;
int yz[N];
int cnt=0;
for(int i=1;i<x;i++) if(x%i==0) yz[++cnt]=i;
int tmp=0;
for(int i=1;i<=cnt;i++) tmp^=_SG(yz[i]);
map<int,bool> mp;
for(int i=1;i<=cnt;i++) mp[tmp^SG[yz[i]]]=1;
int mex;
for(int i=0;i<=cnt;i++){
if(!mp[i]){
mex=i;break;
}
}
return SG[x]=mex;
}
int n,a[N];
int main(){
while(cin>>n){
int sum=0;
memset(SG,-1,sizeof SG);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) sum^=_SG(a[i]);
if(sum) printf("freda\n");
else printf("rainbow\n");
}
return 0;
}