牛客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("
");
	return 0;
} 

  

寻找真正的热爱
原文地址:https://www.cnblogs.com/lesning/p/13619601.html