记录编号 |
183012 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[CEOI 1998]洗牌机 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
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;
}