列表

详情


NC51094. 魔法珠

描述

Freda和rainbow是超自然之界学校(Preternatural Kingdom University,简称PKU)魔法学院的学生。为了展示新学的魔法,Ta们决定进行一场对弈~~~
起初Freda面前有n堆魔法珠,其中第i堆有ai颗。Freda和rainbow可以轮流进行以下操作:
1.选择n堆中魔法珠数量大于1的任意一堆。记该堆魔法珠的数量为p,p有这m个小于p的约数。
2.施展魔法把这一堆魔法珠变成m堆,每堆各有颗魔法珠。
3.选择这m堆中的一堆魔法珠,施展魔法令其消失。
注意一次操作过后,魔法珠的堆数会增加m-2,各堆中魔法珠数量的总和可能会发生变化。
当轮到某人操作时,如果每堆中魔法珠的数量均为1,那么ta就输了。
Freda和rainbow都采取最好的策略,从Freda开始。请你预测一下,谁能获胜呢?

输入描述

本题仅有一个测试点,包含多组数据,以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;
}

上一题