比赛 20101117 评测结果 AAAAAAAAAA
题目名称 教官 最终得分 100
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-17 08:45:17
显示代码纯文本
#include <fstream>

#define I_F "officer.in"
#define O_F "officer.out"
#define MAX 10001

using namespace std;

int h[MAX],s[MAX];
int n,m;
long long ans;

void Input();
void Dfs();
long long max(long long a, long long b);
long long min(long long a, long long b);
long long lcm(long long a, long long b);
void Search();
void Output();

int main()
{
	Input();
	Dfs();
	Search();
	Output();
	return 0;
}

void Input()
{
	ifstream fin(I_F);
	fin>>n;
	for (int i=1; i<=n; fin>>s[i++]);
	fin.close();
}

void Dfs()
{
	bool f[MAX]={false};
	int i,j,t;
	for (i=1; i<=n; i++)
		if (!f[i])
		{
			t=0;
			for (j=i; !f[j]; j=s[j])
			{
				t++;
				f[j]=true;
			}
			h[m++]=t;
		}
}

long long max(long long a, long long b)
{
	if (a>b)
		return a;
	else
		return b;
}

long long min(long long a, long long b)
{
	if (a<b)
		return a;
	else
		return b;
}

long long lcm(long long a, long long b)
{
	long long t1=max(a,b), t2=min(a,b);
	int i;
	for (i=1; i<=t2; i++)
		if (t1*i%t2==0)
			return t1*i;
}

void Search()
{
	ans=h[0];
	int i;
	for (i=1; i<m; i++)
		ans=lcm(ans,h[i]);
}

void Output()
{
	ofstream fout(O_F);
	fout<<ans<<'\n';
	fout.close();
}