题解:CF1748F Circular Xor Reversal
考虑一种基础操作,交换。而交换相当于三次异或,即 a^=b,b^=a,a^=b。考虑如何实现令
-
从
j-1 到i 依次执行操作。 -
从
i+1 到j-1 依次执行操作。 -
从
j-2 到i 依次执行操作。 -
从
i+1 到j-2 依次执行操作。
总共使用
手玩一下即可发现
#include<bits/stdc++.h>
using namespace std;
const int N=405;
int n;
vector<int> ans;
void ins(int x){
ans.push_back(x%n);
}
void sol(int l,int r){
for(int i=r-1;i>=l;i--) ins(i);
while(l<r){
for(int i=l+1;i<=r-1;i++) ins(i);
for(int i=r-2;i>=l;i--) ins(i);
l++,r--;
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
sol(0,n-1);
int d=(n-1)/2;
if(n&1) sol(d+1,n+d-1);
else sol(d+1,n+d);
sol(0,n-1);
cout<<(int)ans.size()<<"\n";
for(int i:ans){
cout<<i<<" ";
}
}