牛客IOI周赛18-提高组 排列
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("\n");
return 0;
}
寻找真正的热爱

浙公网安备 33010602011771号