題解:P9951 [USACO20FEB] Swapity Swap B

cly312發表於2024-09-16

奶牛的排列經過 \(x\) 次後會回到原來的位置,理解以下:\([a_1,a_2]\) 的牛翻轉兩次就會回到原來的位置,\([b_1,b_2]\) 的牛翻轉兩次也會回到原來的位置,所以原來奶牛的排列經過一定次數的旋轉後一定會回到原來位置。

我們只要先模擬得出多少次後第 \(i\) 位的奶牛會回到原來的位置,然後用總次數取模後再進行模擬即可。

程式碼:

#include<bits/stdc++.h>
using namespace std;
int N,K,A1,A2,B1,B2,res[101];

int nex(int x){
	if(A1<=x&&x<=A2) x=A1+A2-x;
	if(B1<=x&&x<=B2) x=B1+B2-x;
	return x;
}
int main(){
	cin>>N>>K>>A1>>A2>>B1>>B2;
	for(int i=1;i<=N;++i){
		int p=1,cur=nex(i);
		while(cur!=i){
			p++;
			cur=nex(cur);
		}
		int k=K%p;
		for(int j=0;j<k;++j)cur=nex(cur);
		res[cur]=i;
	}
	for(int i=1;i<=N;++i) cout<<res[i]<<'\n';
}