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;
}

 

 

posted on 2012-05-02 17:22  Staginner  阅读(192)  评论(0编辑  收藏  举报