poj 1721 CARDS (置換群)
//給出置換了s次後的序列,求原序列
# include
# include
# include
using namespace std;
int main()
{
int n,s,t,s1,i,cot;
int a[1010],b[1010],c[1010];
while(~scanf("%d%d",&n,&s))
{
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
c[i]=a[i];
}
cot=0;
while(1)//求循環節
{
cot++;
for(i=1; i<=n; i++)
b[i]=c[c[i]];
for(i=1; i<=n; i++)
{
if(a[i]!=b[i])
break;
}
if(i>n)
break;
for(i=1; i<=n; i++)
c[i]=b[i];
}
s%=cot;
s=cot-s;
while(s--)
{
for(i=1; i<=n; i++)
b[i]=a[a[i]];
for(i=1; i<=n; i++)
a[i]=b[i];
}
for(i=1; i<=n; i++)
printf("%d\n",b[i]);
}
return 0;
}