无奈,,超时,,
要找每个的循环次数。
置换群每个点的循环不会在中间循环,,就是不会1-5-6-5-6-----的循环,,
每个点都可以到自身。
代码:
#include<cstdio>
#include<cstring>
int shu[220],hu[260];
char ch[260],c[260];
int pp(int wei,int k)
{
if (k==0)
return wei;
return pp(shu[wei],k-1);
}
int main()
{
int n;
while (scanf("%d",&n),n)
{
int a;
for (int i=1;i<=n;i++)
{
scanf("%d",&a);
shu[a]=i;
}
for (int i=1;i<=n;i++)
{
int ji=1,ans=shu[i];
while (i!=ans)
{
ans=shu[ans];
ji++;
}
hu[i]=ji;
}
getchar();
while (gets(ch))
{
if (ch[0]=='0')
break;
int ll=strlen(ch);
int k=0,i;
for (i=0;ch[i]!=' ';i++)
k=k*10+ch[i]-'0';
i++;int kp=1;
for (i;i<ll;i++)
ch[kp++]=ch[i];
for (;kp<=n;kp++)
ch[kp]=' ';
for (int i=1;i<=n;i++)
printf("%c",ch[pp(i,k%hu[i])]);
printf("\n");
}
printf("\n");
}
return 0;
}