题目链接
http://poj.org/problem?id=1721
思路
题目中一开始给出的置换是一个大环,因此一定存在一个xx使得置换在经过xx次洗牌操作后得到原来的置换。
那么最终答案就是原置换在经过x−Smodxx−Smodx次操作后的置换,显然,答案置换经过SS次操作就是原置换。
代码
#include <cstdio>
const int maxn=1000;
int a[maxn+10],n,s,tmp[maxn+10],t[maxn+10];
int main()
{
scanf("%d%d",&n,&s);
for(register int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
tmp[i]=a[i];
}
int cnt=0,flag=1;
while(flag)
{
++cnt;
for(register int i=1; i<=n; ++i)
{
t[i]=tmp[tmp[i]];
}
for(register int i=1; i<=n; ++i)
{
tmp[i]=t[i];
if(tmp[i]==a[i])
{
flag=0;
}
}
}
cnt=cnt-s%cnt;
while(cnt--)
{
for(register int i=1; i<=n; ++i)
{
t[i]=tmp[tmp[i]];
}
for(register int i=1; i<=n; ++i)
{
tmp[i]=t[i];
}
}
for(register int i=1; i<=n; ++i)
{
printf("%d\n",tmp[i]);
}
return 0;
}