NC51094. 魔法珠
描述
输入描述
本题仅有一个测试点,包含多组数据,以EOF结尾。
每组数据的第一行包含一个整数n。
第二行包含n个整数ai。
输出描述
对于每组数据,在两人均采取最佳策略的前提下,若Freda能获胜,输出freda;若Rainbow能获胜,输出rainbow。
示例1
输入:
3 2 2 2 3 1 3 5
输出:
freda rainbow
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 460K, 提交时间: 2020-03-28 19:54:34
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; int c[maxn]; int get(int n) { int cnt=1;c[1]=1; for(int i=2;i*i<=n;i++){ if(n%i==0){ if(i*i!=n) c[++cnt]=i,c[++cnt]=n/i; else c[++cnt]=i; } } return cnt; } int SG[maxn]; int sg(int x) { if(SG[x]!=-1) return SG[x]; int n=get(x),k=0; bool bk[maxn];memset(bk,false,sizeof bk); for(int i=1;i<=n;i++){ k=0; for(int j=1;j<=n;j++) if(i!=j) k^=sg(c[j]); bk[k]=1; } k=0; while(bk[k]) k++; return SG[x]=k; } int main() { for(int i=1;i<maxn;i++) SG[i]=-1; SG[1]=0; int n; while(~scanf("%d",&n)){ int k=0; for(int i=1;i<=n;i++){ int t1;scanf("%d",&t1); k^=sg(t1); } printf("%s\n",k?"freda":"rainbow"); } }
C++ 解法, 执行用时: 3ms, 内存消耗: 288K, 提交时间: 2021-08-08 10:37:56
#include <iostream> #include <cstring> using namespace std; const int MAXN = 1e3 + 7; int sg[MAXN]; bool Mex[MAXN]; int dfs(int x) { if(sg[x] != -1) return sg[x]; for(int i = 1;i*i < x;++i) if(x%i == 0) Mex[dfs(i)] = 1; for(int i = 0;i <= x;++i) if(!Mex[i]) { sg[x] = i; break; } for(int i = 0;i <= x;++i) Mex[i] = 0; return sg[x]; } int main() { int n; memset(sg,-1,sizeof sg);sg[1] = 0; while(~scanf("%d",&n)) { int ans = 0; for(int i = 0;i < n;++i) { int x; scanf("%d",&x); ans ^= dfs(x); } if(ans) puts("freda"); else puts("rainbow"); } return 0; }