您的位置:首页 > 其它

ural 1024 PERMUTATIONS

2015-07-27 14:11 417 查看
这题跟前面的一个codeforces很像,,,,就是一个数一直映射,,,让式子回到原来,,,,,,的周期

先是纯模拟,,错了几回然后TLE:

#include <iostream>

#include<bits/stdc++.h>

using namespace std;

int t=0;

int a[1001],b[1001],c[1001];

int m;

int fuhe()

{

    int i;

    for(i=1;i<=m;i++)

    {

        if(a[i]!=c[i]) return 1;

    }

    return 0;

}

int main()

{

    while(scanf("%d",&m)!=EOF)

    {

    int i;

    for(i=1;i<=m;i++)

    {

        scanf("%d",&a[i]);

        c[i]=a[i];

    }

    for(i=1;i<=m;i++)

    {

            b[i]=a[i];

    }

    int flag=0;

    while(flag==0||fuhe()==1)

    {

        flag++;

        for(i=1;i<=m;i++) a[i]=b[a[i]];

        //for(i=1;i<=m;i++) printf("%d ",a[i]);

        //puts("");

        t++;

    }

    printf("%d\n",t);

    }

    return 0;

}

TLE是我最能接受得了,,,,,说明理解对想算法就好了。。。。。。

于是求每个数字的周期的最小公倍数。。。。

第一次还是超时了。。。。。。。。

#include <iostream>

#include<bits/stdc++.h>

using namespace std;

int t=0;

int a[1001],b[1001],c[1001];

int m;

int zdgys(int a,int b)

{

    if(a>b)

    {

        if(a%b==0) return b;

        return zdgys(a%b,b);

    }

    if(a<=b)

    {

        if(b%a==0) return a;

        return zdgys(b%a,a);

    }

}

int main()

{

    while(scanf("%d",&m)!=EOF)

    {

    int i;

    for(i=1;i<=m;i++)

    {

        scanf("%d",&a[i]);

    }

    for(i=1;i<=m;i++)

    {

        b[i]=a[a[i]];

    }

    int t;

    int ans=1;

    for(i=1;i<=m;i++)

    {

        t=1;

        while(b[i]!=a[i])

        {

            b[i]=a[b[i]];

            t++;

        }

        ans=t*ans/zdgys(t,ans);

        //printf("%d**%d\n",t,ans);

    }

    printf("%d\n",ans);

    }

    return 0;

}

我心想,,,不能啊

原来是没开longlong。。。。。。。。。。。。。。。。。。。。。。。。

#include <iostream>

#include<bits/stdc++.h>

using namespace std;

long long int a[1001],b[1001],c[1001];

long long int m;

long long int zdgys(long long int a,long long int b)

{

    if(a>b)

    {

        if(a%b==0) return b;

        return zdgys(a%b,b);

    }

    if(a<=b)

    {

        if(b%a==0) return a;

        return zdgys(b%a,a);

    }

}

int main()

{

    scanf("%lld",&m);

    int i;

    for(i=1;i<=m;i++)

    {

        scanf("%lld",&a[i]);

    }

    for(i=1;i<=m;i++)

    {

        b[i]=a[a[i]];

    }

    int t;

    long long int ans=1;

    for(i=1;i<=m;i++)

    {

        t=1;

        while(b[i]!=a[i])

        {

            b[i]=a[b[i]];

            t++;

        }

        ans=t*ans/zdgys(t,ans);

        //printf("%d**%d\n",t,ans);

    }

    printf("%lld\n",ans);

    return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: