码迷,mamicode.com
首页 > 其他好文 > 详细

ural 1024 PERMUTATIONS

时间:2015-07-27 15:02:31      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

这题跟前面的一个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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

ural 1024 PERMUTATIONS

标签:

原文地址:http://blog.csdn.net/zhangwenchi/article/details/47083977

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!