【2022noip多校】异或
【题目描述】
对于一个元素介于 \([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\) 位相同,这个可以从之前的例子中看出。
接下来考虑下一层:
若集合 \(p_{l,..,mid}=p_{mid+1,..,r}\) 则表示下一位这两边也相同,则将方案数乘二,问题规模减半
若集合 \(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多校】异或的更多相关文章
- NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)
题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...
- 2015 多校联赛 ——HDU5416(异或)
CRB has a tree, whose vertices are labeled by 1, 2, …, N. They are connected by N – 1 edges. Each ed ...
- 2020牛客暑期多校训练营(第五场)B - Graph (异或 最小生成树 分治 Trie)
B - Graph 题目链接 每次操作不会改变两点之间的路径异或和 以 1 号点为起点,算出任意一点到 1 号点的异或值 dis[i](把该值当做 i 号点权值), 那么任意两点的异或值为 \(dis ...
- GPS校时器,GPS时钟装置,NTP网络时间服务器
GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
- dfs套异或的包含性——cf986C好
很好的题,想了半天,官方题解的解法更好 这种异或问题的包含性在北邮的校赛里就出现过,需要认真学习一下 /* y和所有合法的x合并,如果没有剪枝,那么复杂度爆炸总共要判(2^n*2^n) 可以考虑如下优 ...
- HDU6579 2019HDU多校训练赛第一场1002 (线性基)
HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...
- xdoj 2020校赛复盘
平时写东西都不喜欢复盘,这肯定不是一个好习惯,感觉每次花好几个小时甚至好几天写题目然后没写出来也不去看题解是一种很蠢的行为( 花了这么久时间打校赛,虽然水平很low,数据结构也不太会用,还是记录一下自 ...
- Android数据加密之异或加密算法
前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...
随机推荐
- Linux中scanf类型匹配错误,特指scanf("%d", &c ) ,导致死循环的解决方法 —— fflush(stdin)和getchar()的使用
如题,朋友领导的孩子大学作业是个C语言编写的管理信息系统发来要我给改改,原代码的配置环境是Windows的C环境,由于10多年没有搞过Windows下的C语言了于是换上了Ubuntu18.04的系统上 ...
- 使用Linux桌面壁纸应用variety发现的一些问题
本人Ubuntu18.04 Desktop系统安装桌面壁纸应用variety,设置如下: 使用大致两个小时,主机为NVIDIA显卡,查看显存使用情况: 可以发现随着使用时间的增加variety会逐渐增 ...
- 8月5日CSP-S模拟赛赛后总结
8月5日CSP-S模拟赛赛后总结 \[8月5日 \ \ CSP-S模拟赛 \ \ 赛后总结 \\ 2024年8月5日 \\ by \ \ \ uhw177po \] 一.做题情况 第一题比赛 \(10 ...
- 【导师招募】Apache DolphinScheduler 社区又又又入选开源之夏啦!
很高兴和大家宣布,Apache DolphinScheduler 社区今年再次成功入选入选由中国科学院软件研究所开源软件供应链点亮计划发起的"开源之夏"活动. 入选公示链接:htt ...
- Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
什么是面向对象编程 (OOP)? OOP 代表面向对象编程. 过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象. 与过程式编程相比,面向对象编程具有以下几个优势: ...
- @ComponentScan
@ComponentScan 是一个注解,用于Spring框架,它允许开发者指定Spring应该扫描哪个包或包下的子包来寻找组件(如@Component.@Service.@Repository等注解 ...
- 优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策
Web层缓存对于提高应用性能至关重要,它通过减少重复的数据处理和数据库查询来加快响应时间.例如,如果一个用户请求的数据已经缓存,服务器可以直接从缓存中返回结果,避免了每次请求都进行复杂的计算或数据库查 ...
- Buckingham-Reiner 方程和 Darby-Melson 经验方程
由 Roni, et al. (2018), Woolley, et al. (2014), Yang, et al. (2017) 整理人便便的物理性质数据如下: 性质 值 密度 \((\text{ ...
- Go 互斥锁 Mutex 源码分析(二)
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 Go 互斥锁 Mutex 源码分析(一) 一文中分析了互斥锁的结构和基本的抢占互斥锁的场景.在学习锁的过程中,看的不少文章是基于锁的状态解释 ...
- Visual Studio Code 配置文件关联
在编写 Linux 的 .service 文件的时候,我发现 .service 文件的本质是 INI 文件.然而 VS Code 却并没有使用 INI 格式进行语法高亮.于是我通过如下设置使 VS C ...