奶牛的排列经过 \(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';
}