模拟出一次操作后的排列,那么一次操作相当于乘上了这样一个置换。找出所有环,则每个数会在环上移动 步,按顺序求出环上的元素,那么加上
后对环长取模即可得到最后的数。
// ====================================
// author: M_sea
// website: https://m-sea-blog.com/
// ====================================
#include <bits/stdc++.h>
#define file(x) freopen(#x".in","r",stdin); freopen(#x".out","w",stdout)
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
int read() {
int X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
return X*w;
}
const int N=100000+10;
int n,m,k,l[N],r[N];
int p[N],vis[N],ans[N];
int sta[N],top;
int main() {
n=read(),m=read(),k=read();
for (int i=1;i<=n;++i) p[i]=i;
for (int i=1;i<=m;++i) l[i]=read(),r[i]=read(),reverse(p+l[i],p+r[i]+1);
for (int i=1;i<=n;++i) {
if (vis[i]) continue;
top=0; sta[top++]=i;
for (int j=p[i];j!=i;j=p[j]) vis[j]=1,sta[top++]=j;
ans[i]=sta[k%top];
for (int j=p[i],c=1;j!=i;j=p[j],++c) ans[j]=sta[(c+k)%top];
}
for (int i=1;i<=n;++i) printf("%d ",ans[i]); puts("");
return 0;
} 
京公网安备 11010502036488号