记录编号 183012 评测结果 AAAAAAAAAA
题目名称 [CEOI 1998]洗牌机 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2015-08-29 15:54:43 内存使用 0.32 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
int N,S;
int a[1010];
class miku//置换群
{
public:
	int n;
	int s[1010];
	miku()
	{
		n=0;
		memset(s,0,sizeof(s));
	}
	void make()
	{
		n=N;
		s[1]=1;
		int now=a[1];
		for(int i=2;i<=n;i++)
		{
			s[i]=now;
			now=a[now];
		}
	}
	void print()
	{
		int ans[1010]={0};
		int now=1;
		for(int i=1;i<n;i++)
		{
			ans[now]=s[i+1];
			now=s[i+1];
		}
		ans[now]=1;
		for(int i=1;i<=n;i++)
			printf("%d\n",ans[i]);
	}
}P;
int qmi(int a,int t)
{
	int re=1;
	while(t)
	{
		if(t&1) re*=a;
		t>>=1;a*=a;re%=N,a%=N;
	}
	return re;
}
miku sq(miku a,int t)
{
	miku re;
	re.n=a.n;
	re.s[1]=a.s[1];
	int now=1,n=a.n;
	for(int i=2;i<=n;i++)
	{
		now=(now-1+t)%n+1;
		re.s[now]=a.s[i];
	}
	return re;	
}
int main()
{
	freopen("shuffle.in","r",stdin);
	freopen("shuffle.out","w",stdout);
	scanf("%d%d",&N,&S);
	for(int i=1;i<=N;i++)
		scanf("%d",&a[i]);
	P.make();
	int tem=qmi(2,S);
	tem%=N;
	miku ans;
	//cout<<now<<endl;
	ans=sq(P,tem);
	//for(int i=1;i<=N;i++)
	//	cout<<ans.s[i]<<endl;
	ans.print();
	return 0;
}