【题目描述】

对于一个元素介于 \([0,2^m)\) 且互不相同的长度为 \(n\) 的序列 \(a_1, a_2 ...,a_n\) ,定义它的特征序列为 \(p_0,p_1,...,p_{2^m-1}\) ,其中 \(p_i\) 表示使得 \(a_{p_i}\) 与 \(i\) 的异或值最大的下标。

​ 形式化地,定义 $ p_i=\arg \max\limits_{1<=j<=n} a_j \oplus i $

给定一个特征序列 \(p\) ,求有多少个满足要求的原序列 \(a\) 可以得到这个特征序列。

​ 答案对 \(10^9+7\) 取模

【样例】

【样例输入1】
6 3
1 1 2 2 3 4 5 6
【样例输出1】
4

【解析】

首先明确,合法的 \(p\) 中,必定出现完整的 \([1,n]\)

将\([0,2^m-1)\) 的二进制形式依次写出(取 \(m=3\) )

000 001 010 011 100 101 110 111

发现每次取一半,在第 \(k\) 次时,会使从高到底第 \(k\) 为发生 \(0,1\) 分割

所以考虑分治:

设状态 \([l,r]\) 表示在 \([l,r]\) 中,任意 \(a_{p_i} \oplus i\) 的前 \(dep\) 位相同, \(dep\) 表示分治深度。

其实这也代表了 \(a_{p_i}\) 前 \(dep\) 位相同,这个可以从之前的例子中看出。

接下来考虑下一层:

  1. 若集合 \(p_{l,..,mid}=p_{mid+1,..,r}\) 则表示下一位这两边也相同,则将方案数乘二,问题规模减半

  2. 若集合 \(p_{l,..,mid}!=p_{mid+1,..,r}\) 则代表下一位不同,且可以得出 \(a_{l,..,mid}\) 的 \(dep\) 位一定为 \(1\) , \(a_{mid+1,..,r}\) 的 \(dep\) 位一定为 \(0\),因为要保持最大且左区间的 \(dep\) 位均为 \(0\) ,右区间均为 \(1\) 所以有以上结论。之后这两种情况就独立了,乘法原理直接乘起来就可以了。

    考虑无解,即集合 \(p_{l,..,mid}!=p_{mid+1,..,r}\) 但 \(p_{l,..,mid}\cap p_{mid+1,..,r}!=\varnothing\) 就无解。

【CODE】

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = (1<<16)+33;
inline ll read_int(){
ll a=0;bool f=0;char g=getchar();
while(g<'0'||'9'<g) {if(g=='-') f=1;g=getchar();}
while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
return f ? -a : a;
} inline void write(ll a,bool b=1){
if(a<0) a=-a,putchar('-');
ll lin[30],top=0;
while(a) lin[++top]=a%10,a/=10;
if(top==0) lin[++top]=0;
while(top) putchar(lin[top--]+'0');
if(b) putchar('\n');
} ll n,m,mod=1e9+7;
ll sj[maxn];
ll vis[maxn]; inline ll fz(ll l,ll r){
// cout<<l<<" "<<r<<endl;
if(l==r) return 1;
ll mid=(l+r)>>1;
int bt=0,xd=0;
set<int> a,b;
int f=0;
for(int i=l;i<=mid;i++) a.emplace(sj[i]);
for(int i=mid+1;i<=r;i++) b.emplace(sj[i]),f= (f||(a.find(sj[i])!=a.end()) ? 1 : 0);
if(f&&a!=b) return 0;
if(a==b) return (ll)2*fz(l,mid)%mod;
else return fz(l,mid)*fz(mid+1,r)%mod;
} inline void read(){
n=read_int(),m=read_int();
for(int i=1;i<=(1<<m);i++) sj[i]=read_int(),vis[sj[i]]=1;
for(int i=1;i<=n;i++){
if(vis[i]==0) {write(0);return;}
}
write(fz(1,(1<<m)));
} int main (){
// freopen(".out","w",stdout);
read();
// while(1) getchar();
}

【后记】

如有大佬知道之前那个合法的 \(p\) 中必有 \([i,n]\) 是如何证明的,请留言

【2022noip多校】异或的更多相关文章

  1. NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)

    题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...

  2. 2015 多校联赛 ——HDU5416(异或)

    CRB has a tree, whose vertices are labeled by 1, 2, …, N. They are connected by N – 1 edges. Each ed ...

  3. 2020牛客暑期多校训练营(第五场)B - Graph (异或 最小生成树 分治 Trie)

    B - Graph 题目链接 每次操作不会改变两点之间的路径异或和 以 1 号点为起点,算出任意一点到 1 号点的异或值 dis[i](把该值当做 i 号点权值), 那么任意两点的异或值为 \(dis ...

  4. GPS校时器,GPS时钟装置,NTP网络时间服务器

    GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间 ...

  5. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  6. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  7. dfs套异或的包含性——cf986C好

    很好的题,想了半天,官方题解的解法更好 这种异或问题的包含性在北邮的校赛里就出现过,需要认真学习一下 /* y和所有合法的x合并,如果没有剪枝,那么复杂度爆炸总共要判(2^n*2^n) 可以考虑如下优 ...

  8. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  9. xdoj 2020校赛复盘

    平时写东西都不喜欢复盘,这肯定不是一个好习惯,感觉每次花好几个小时甚至好几天写题目然后没写出来也不去看题解是一种很蠢的行为( 花了这么久时间打校赛,虽然水平很low,数据结构也不太会用,还是记录一下自 ...

  10. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

随机推荐

  1. 读《Simple statistical gradient-following algorithms for connectionist reinforcement learning》论文 提出Reinforce算法的论文

    <Simple statistical gradient-following algorithms for connectionist reinforcement learning>发表于 ...

  2. 【转载】 t-SNE是什么? —— 使用指南

    原文地址: https://www.cnblogs.com/LuckBelongsToStrugglingMan/p/14161405.html 转者前言: 该文相当于一个  t-SNE  使用指南, ...

  3. "揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计"

    Centoschina 项目要求 爬取centoschina_cn的所有问题,包括文章标题和内容 数据库表设计 库表设计: 数据展示: 项目亮点 低耦合,高内聚. 爬虫专有settings custo ...

  4. zabbix 二次开发(添加menu)

    zabbix 二次开发--- 在zabbix菜单栏中增加 CMDB 菜单,该菜单下有个子栏目 CMDB overview,如图: 实现此效果,我们需要修改两个地方:menu.inc.php 和 mai ...

  5. thymeleaf学习问题整理

    使用配置 <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.9. ...

  6. js_for循环的错误

    本段代码实现的效果是遍历数组中的每个元素,给每个元素插入一个类名 for (var i = 0; i < dropdownLi.length; i++) { if(i == 1){ contin ...

  7. android java.lang.Exception: java.net.ProtocolException: Expected HTTP 101 response

    Android stomp长连接连接异常: 报错:java.lang.Exception: java.net.ProtocolException: Expected HTTP 101 response ...

  8. CM3和ARM7的差异

    此文章由文心一言生成,引用请标注作者:文心一言CM3通常指的是Cortex-M3,它是ARM公司设计的一种基于ARMv7-M架构的32位处理器内核,主要用于嵌入式系统.而ARM7则是ARM公司早期设计 ...

  9. c# RSA加密解密,与java代码互通问题

    RSA加密解密原本是公开算法,但是和一个java的小伙伴对接却出现了点问题,现在记录一下 首先,RSA的公钥私钥,有2种: 1.pem格式. 2.xml格式. 文章底部有pem格式和对应的xml样本数 ...

  10. 注册中心Nacos集群搭建

    一提到注册中心,大家往往想到Zookeeper.或者Eureka.今天我们看看阿里的一款配置中心+注册中心的中间件--Nacos.有了它以后,我们的项目中的配置就可以统一从Nacos中获取了,而且Sp ...