hihoCoder 数组重排
找每个位置循环节的大小。
得到结果d1, d2, ....., dn。
最终结果cmd(d1, d2, ...., dn)。
水题。
题目链接:
http://hihocoder.com/contest/hihointerview11/problem/1
代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int maxn = 100 + 10; 5 typedef long long int64; 6 7 int n; 8 int p[maxn]; 9 10 int64 cal(int a){ 11 int t = p[a], cnt = 1; 12 while(t != a){ 13 t = p[t]; 14 cnt++; 15 } 16 17 return (int64)cnt; 18 } 19 20 int64 gcd(int64 a, int64 b){ 21 if( b == 0 ) 22 return a; 23 return gcd(b, a%b); 24 } 25 26 int main(void){ 27 scanf("%d", &n); 28 29 for(int i = 1; i <= n; ++i){ 30 scanf("%d", &p[i]); 31 } 32 33 int64 a = cal(1); 34 int64 ans = a; 35 for(int i = 2; i <= n; ++i){ 36 int64 b = cal(i); 37 ans = ans * b / gcd(ans, b); 38 } 39 40 printf("%d\n", (int)ans); 41 42 return 0; 43 }