https://ac.nowcoder.com/acm/contest/7225/A
一句话,按照list转一圈,把list按照list转之后就是转两圈,快速幂的思想
#include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int maxn = 2e5+11; int list[maxn]; int ans[maxn]; int vis[maxn]; int n,m,k; int k_q(int a,int b){ int res = 1; while(b){ if(b&1){ res = res*a; } b>>=1; a *=a; } return 0; } int cal(int *a,int *b){ for(int i=1;i<=n;i++){ vis[i] = a[b[i]]; } for(int i=1;i<=n;i++){ a[i] = vis[i]; } return 0; } int main(){ scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++){ list[i] = i; ans[i] = i; } for(int i=0;i<m;i++){ int x,y; scanf("%d %d",&x,&y); for(int j=0;j<(y - x + 1)/2;j++){ swap(list[x+j],list[y-j]); } } while(k){ if(k&1){ cal(ans,list); } k>>=1; cal(list,list); } for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } printf(" "); return 0; }