首页 > 其他分享 >[ABC126F] XOR Matching 题解

[ABC126F] XOR Matching 题解

时间:2024-06-07 19:54:48浏览次数:31  
标签:dots XOR 题解 ll printf 序列 oplus Matching lld

很好的构造题。

题意

请构造一个长度为 $2^{m+1}$ 的序列 $a$,该序列满足:

  • $\forall i \in[1, 2^{m+1}], a_i \in [0, 2^m-1]$ 且每个数都恰好出现两次。
  • 对于任意一对 $(i, j)$ 满足 $a_i = a_j$,$a_i\oplus a_{i+1} \oplus \cdots \oplus a_{j-1} \oplus a_j = k$。

$\oplus$ 表示按位异或。

思路

很显然,当 $k>2^m-1$ 时无解。

再考虑平凡的的情况:

  • 当 $m$ 为 $0$,$k$ 为 $0$ 时,只有 0 0 一组解。
  • 当 $m$ 为 $1$,$k$ 为 $0$ 时,样例告诉我们只有 0 0 1 1 一组解。
  • 当 $m$ 为 $1$,$k$ 为 $1$ 时,样例告诉我们无解。

接下来考虑一般情况:

我们知道,$a \oplus a$ 为零,所以只需构造一个序列形如:

$$ 0,1 \dots 2m-1,k,2m-1 \dots 1,0,k $$

该式满足:对于任意一对 $(i, j)$,$a_i = a_j$,$a_i\oplus a_{i+1} \oplus \cdots \oplus a_{j-1} \oplus a_j = k$。
显然,这个序列除最后一个元素外是回文的,并且所有数字都出现了 $2$ 次,正好可以相互抵消。
对于 $k$ 形成的子序列,有一个公式:$0\oplus 1 \oplus 2 \oplus \dots \oplus k=0$,因为在 $0$ 至 $k$ 的序列中,每一位上都出现了偶数个 $1$,全部抵消后便为 $k \oplus 0=k$。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,s,d[100005],f;
ll ans;
int main(){
    scanf("%lld%lld",&a,&s);
    if(a==1&&s==0){
        printf("0 0 1 1");
        return 0;
    } 
	if(s>=pow(2,a)){
		printf("-1");
		return 0;
	}
	for(int i=0;i<pow(2,a);i++){ 
		if(i==s) continue;
		printf("%lld ",i);
	}
	printf("%lld ",s);
	for(int i=pow(2,a)-1;i>=0;i--){ 
		if(i==s) continue;
		printf("%lld ",i);
	}
	printf("%lld",s);
    return 0;
}

标签:dots,XOR,题解,ll,printf,序列,oplus,Matching,lld
From: https://www.cnblogs.com/PerchLootie/p/18237789

相关文章

  • 食物链题解
    由题得,所有动物整体关系如上。起初每个动物相互时间没有关系,bb[i]=i。对于x与y:如果它们是同类即x到y的距离为$0$,或者转了几圈,一圈距离为$3$,即模$3$余$0$。如果x捕食y,就是x到y距离模$3$余$1$。对x与y操作时:如果它们没有关系(它们不被之前给出的某......
  • 题解:ABC270G Sequence in mod P
    题目传送门思路题目给出了一个数列\[x_{i+1}\equiv{a\timesx_i+b}\pmod{p}\]并想要求最小的\(x_i=G\),那我们可以考虑求出这个数列的通项公式。具体的,观察到原式可以转化成一个等比数列的形式,所以我们可以先设一个常数\(k\),使得\[x_{i+1}+k=a(x_i+k)\]替换进原先的式子......
  • codeforces round 961题解(A、B、C)
    A.GuesstheMaximum因为\(i<j\),所以所有的\([i,j]\)区间中都至少包含两个相邻元素,所以只要求出所有相邻元素中较大值的最小值即可。intn;inta[N];voidsolve(){cin>>n;intmin_v=1e9+1;for(inti=1;i<=n;i++){cin>>a[i];......
  • 怎么发送超大文件?困扰已久的邮件大附件发送问题解决了!
    邮件是日常中使用最多的文件流转工具,特别是对于企业内部的员工间、及企业与企业间的业务开展,数据和文件的发送、业务留痕大多都基于邮箱展开。邮箱的普遍使用给用户基于邮箱进行业务沟通提供了前提,其中,Outlook邮箱是使用最广泛的邮箱之一。这使得邮箱成为一种最常用的通讯工具,但......
  • CF1651E Sum of Matchings
    标签:图论鱼鱼蒸题。原图由若干个偶环组成,那么对于每个环分别计算贡献,枚举环上的一段区间,然后算出要能包含这一段的\(l,r,L,R\)的对应的最小区间,然后又不能包含这段区间左右的点,所以要去掉一部分,然后乘起来再乘上区间长度的一半即可。优美的代码实现。#include<bits/stdc++.......
  • 6月6日模拟赛题解
    P4315月下“毛景树”没代码能力,写不动,赛时没写。注意pushdown即可。#include<bits/stdc++.h>inlineintread(){ charch=getchar();intx=0,f=1; for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<......
  • arc179d 题解
    arc179d思路设计树形dp。\(dp_{u,0}\)表示进子树\(u\)并不再出去的代价。\(dp_{u,1}\)表示进子树\(u\)并返回,且传送门在\(fa\)、不在子树内使用传送门的代价。\(dp_{u,2}\)表示进入子树\(u\)并返回,且可以在子树内使用传送门。发现\(dp_{u,1}\)一定是遍历子树最后......
  • abc355f 题解
    abc355f直接贺lct维护mst的代码。思路观察到\(w_i\le10\),考虑分开建\(10\)个图表示边权小于等于\(i\)的边组成的图。连并查集,记录当前图连了\(siz_i\)条边。可以发现第\(i-1\)个图是第\(i\)个图的子图。所以差分\(siz_i-siz_{i-1}\)可以得到原图的最小生成......
  • CF1575E 题解
    CF1575E思路点分治,记录当前子树到分治中心的权值和和换车次数。将新子树的答案合并时分类讨论分治中心到子树祖先\(u\tov\)的颜色。树状数组维护前缀和。复杂度\(O(n\log^2n)\)。codeintn,k,a[maxn],ans;inthead[maxn],tot;structnd{ intnxt,to,fl;}e[maxn<<1];......
  • abc355e 题解
    abc355e思路WC2024T3中知道一个技巧:如果知道区间\([l,r]\)的和就连边\(l\tor+1\),那么想推出\([L,R]\)的区间和就要求\(L\)和\(R+1\)联通。按题意把符合要求的边连上,设边权为\(1\)跑bfs,求出\(L\)到\(R+1\)的最短路并记录路径上的点,就可以得到要询问的区间。......