URAL 1024 Permutations

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;

}

 

 

你可能感兴趣的:(IO)