标签:
这题跟前面的一个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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zhangwenchi/article/details/47083977