题目链接:https://www.luogu.org/problemnew/show/T2078
一开始打了个30分代码如下:
#include<iostream>
#include <algorithm>
using namespace std;
int k,n,a[100010],b[100010],c[100010];
int main()
{
cin>>n>>k;
for (int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=i;
}
for (int i=1;i<=k;i++)
{
for (int j=1;j<=n;j++)
{
c[a[j]]=b[j];
}
for (int j=1;j<=n;j++)
{
b[j]=c[j];
cout<<b[j]<<" ";
}
cout<<endl;
}
// for (int j=1;j<=n;j++)
// {
// cout<<b[j]<<" ";
// }
return 0;
}
大神给了个AC代码如下,仰望大神啊。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int A[100001];
int s[100001],t[100001];
long long n,k;
long long m,p,q,r;
cin >> n >> k;
for(long long i=1;i<=n;i++){
cin >> A[i];
s[i]=0;
}
for(long long i=1;i<=n;i++){
if(s[i]>0) continue;
m=0;
p=i;
t[0]=i;
do{//计算单个数重复周期
p=A[p];
m++;
t[m]=p;
}while(p!=i);
q=k%m;
p=i;
do{//全环设置
r=t[q];
s[r]=p;
p=A[p];
q++;
q=q%m;
}while(p!=i);
}
for(long long i=1;i<=n;i++){
cout << s[i] << " ";
}
return 0;
}
杨大神给了个小孩学习代码
#include<iostream>
using namespace std;
long long n,k;
int main() //本题要求输出位置1,2。。。n分别坐了几号小朋友
{
cin>>n>>k;
long long i,j,len_huan,ans[n+1]; //ans[i]表示位置i上的小朋友的编号
long long a[n+1],huan[n+1]; //a[i]代表输入的位置轮换规则---i位置的小朋友换去a[i]位置
for(i=1;i<=n;i++)
{
cin>>a[i]; //输入轮换规则 :原i号位置本轮换去a[i]位置
ans[i]=0;
}
//以下用一个for计算每个小朋友的的最终位置, (但for语句中的i增量需更有效率,简单的i++会超时)
//huan[]是从a[]中提取出来的闭环,长度定义为len_huan,huan[0]是初始位置i,huan[len_]=huan[0]
//huan[0]=i(即第i个位置),huan[1]=a[i]代表i号位变去了huan[1]位置,huan[2]=huan[huan[1]]代表huan[1]号位换去了huan[2]位置,...递推关系
//递推结束条件:huan[len]=huan[0]---之后做两件事:1、把此环的全部'位置',计算出ans; (作废)2、得出下一个新的huan的起始位置new_i
//任务1:
//huan[1]变换k次后的位置是huan[k%len],这是i号小朋友的最终位置;
//huan[2]变换k次后的位置是huan[k%len+1],这是huan[1]号小朋友的最终位置;
//......
//huan[len]变换k次后的位置是huan[k%len+len-1],....因为 k%len+len-1 可能大于len,所以需对通项再次mod(len)
//所以huan[j]变换k次后的位置是huan[(k%len+j-1)%len],这是第huan[j-1]号小朋友的最终位置;
//按题目要求准备输出数组ans[]的值,即ans[huan[(k%len+j-1)%len]]= huan[j-1]
//任务2:
//new_i :不需要,学习了
//for结束条件: 不需要,学习了
for(i=1;i<=n;i++)
{
if(ans[i]!=0)continue;
//找从初始第i个小孩(亦即第i个位置)开始的位置变换"环”
huan[0]=i; len_huan=1;
huan[len_huan]=a[i];
while(huan[len_huan]!=i)
{
len_huan=len_huan+1;
huan[len_huan]=a[huan[len_huan-1]];
}
for(j=1;j<=len_huan;j++)
ans[huan[(k%len_huan+j-1)%len_huan]]= huan[j-1];
}
for(i=1;i<=n;i++)cout<<ans[i]<<" ";
return 0;
}