URAL_1024
实际上就是去求若干循环节的最小公倍数,题目中说明了数据会保证最后结果不大于10^9,不过超int的情况还是很好构造出来的,让循环节长度分别等于一连串的素数即可。
#include<stdio.h> #include<string.h> #define MAXD 1010 int N, P[MAXD], vis[MAXD]; int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); } void solve() { int i, j, k, cnt, ans = 1; for(i = 1; i <= N; i ++) scanf("%d", &P[i]); memset(vis, 0, sizeof(vis)); for(i = 1; i <= N; i ++) if(!vis[i]) { vis[i] = 1; j = i; cnt = 1; while(!vis[P[j]]) { j = P[j]; vis[j] = 1; ++ cnt; } ans = ans / gcd(ans, cnt) * cnt; } printf("%d\n", ans); } int main() { while(scanf("%d", &N) == 1) { solve(); } return 0; }