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