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;
}
posted @ 2026-01-24 14:19  OTn53_qwq  阅读(12)  评论(0)    收藏  举报