题解:P9951 [USACO20FEB] Swapity Swap B

奶牛的排列经过 \(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';
}
posted @ 2024-09-16 12:21  cly312  阅读(19)  评论(0)    收藏  举报