codeforces 741A

来源:互联网 发布:视频源码链接 编辑:程序博客网 时间:2024/05/21 14:07

题目大意:

很多个人,一次给对应的人打电话。第t个人就是第一个人的Joon-Joon。问t最小为多少可以让每两个人

互为Joon-Joon。

做法:

对于每一个人我们求一次环的长度,然后如果是偶数除以2,然后把n个环长取一个最小公倍数就好了。其中特判一下不能构成环的情况即可。答案是会爆longlong的,第一遍我又没开,总是挂在这种傻傻的地方。

代码如下:

#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;int vis[100005];int a[100005];long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);}int find(int x,int goal,int sum){if (x==goal) return sum;if (vis[x]>2) return 0;vis[x]++;find(a[x],goal,sum+1);}int main(){int n; long long ans;scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=n;i++){memset(vis,0,sizeof(vis));int t=find(a[i],i,1);if (t==0){printf("%d",-1);return 0;}if (t%2==0) t=t/2;if (i==1) ans=t;else ans=ans*t/gcd(ans,t);}printf("%lld",ans);return 0;}


原创粉丝点击