您的位置:首页 > 其它

742 C. Arpa's loud Owf and Mehrdad's evil plan codeforces

2016-12-27 22:07 441 查看
思路:在这个集合中找到一共有多少的环,如果环中元素个数为奇数,则不变,为偶数,则除以2,最后求出所有环的最小公倍数。

#include<bits/stdc++.h>
using namespace std;
int pre[105],n,num;
bool visit[105];
void dfs(int x,int now)
{
if(visit[now])
{
num=-1;
return;
}
num++;
if(now==x)
{
return;
}
dfs(x,pre[now]);
visit[now]=1;
}
int lcm(int a,int b)
{
int aa=a,bb=b;
if(aa<bb)swap(aa,bb);
int temp=aa%bb;
while(temp)
{
aa=bb;
bb=temp;
temp=aa%bb;
}
return a*b/bb;
}
int main()
{
int now=-1,flag=0,flag1=0;
cin>>n;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=n;i++)
{
cin>>pre[i];
if(!visit[pre[i]])
visit[pre[i]]=1;
else
flag1=1;
}
if(flag1)
cout<<-1<<endl;
else
{
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{
if(!visit[i])
{
num=0;
dfs(i,pre[i]);
if(num==-1)
{
flag=1;
break;
}
else if(now==-1)
{
if(num%2==0)num/=2;
now=num;
}
else if(now!=num)
{
if(num%2==0)num/=2;
now=lcm(now,num);
}
visit[i]=1;
}
}
if(flag)
cout<<-1<<endl;
else
cout<<now<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: