一本通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;
}
posted @ 2023-07-25 14:11  Zimo_666  阅读(8)  评论(0编辑  收藏  举报