Codeforces Round 1075 Div 2 部分题目题解
比赛传送门:Codeforces Round 1075 Div 2。
ABC1 赛时切了,D1D2 赛后切了。
C2 题解
首先要会 C1 的构造,令 \(p_{n}=1\),然后 \(p_i=1\oplus i,1<i<n\),若 \(n\) 为奇数则 \(p_1=n-1\) 否则 \(p_1=n\)。
显然若 \(n\) 为奇数,构造显然成立,对于 \(n\) 为偶数,令 \(x\) 为 \(n\) 减去二进制最高位的值,将 \(p_1\) 于 \(p_x\) 交换即可。
注意当 \(n=2^k\) 时显然无解。
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
inline int read(){
char c=getchar();
int f=1,ans=0;
while(c<48||c>57) f=(c==45?f=-1:1),c=getchar();
while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
return ans*f;
}
const int N=2e5+10;
int a[N];
inline void solve(){
int n=read();
int x=log2(n);
if (n==(1<<x)){puts("-1");return ;}
a[n]=1;
for (int i=2;i<n;i++) a[i]=1^i;
a[1]=(n%2==0?n:n-1);
if (n%2==0) swap(a[1],a[n-(1<<x)]);
for (int i=1;i<=n;i++) cout <<a[i]<<" ";puts("");
}
main(){
int T=read();
while(T--) solve();
return 0;
}

浙公网安备 33010602011771号