给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 \leq x_i \leq m_i\)

Solution

从最高位开始看起,毫无疑问,如果 \(m_i\) 的某一位是 \(0\),那么 \(x_i\) 的这一位只能填 \(0\),所以只有那些 \(m_i\) 最高位是 \(1\) 的才具有选择权。

考虑从最高位数起,哪一位 \(pos\) 开始,存在一个 \(i\) 使得 \(x_i \neq m_i\),很显然这个 \(pos\) 是有范围的,它一定是从最高位开始往下的一段区间,因为如果某一位上,\(m_i\) 这一位的异或和 \(\neq k\) 的这一位,更低的位就可以扔掉了。

假设从第 \(pos\) 位开始,存在一个 \(i\) 使得 \(x_i \neq m_i\),我们需要统计所有满足这个条件的答案,不妨把这个部分的贡献称作第 \(pos\) 位的贡献。

设 \(f[i][j]\) 表示前 \(i\) 个 \(m\) 的当前位是 \(1\) 的数中,选择了 \(j\) 个 \(x\) 的当前位是 \(1\),\(i-j\) 个是 \(0\) 的方案数,那么

\[f[i][j]=f[i-1][j-1]\cdot (x_i \ mod \ 2^{pos} + 1) + f[i-1][j]\cdot 2^{pos}
\]

考虑如何统计第 \(pos\) 位的贡献,假设这位 \(1\) 的个数为 \(cnt\),那么 \(f[cnt][j]\) 答案的贡献是 \(f[cnt][j]/2^{pos}\),当 \(j\) 与 \(k\) 该位的奇偶性相同时产生。

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 105;
const int mod = 1e9+7;
inline void exgcd(int a,int b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-(a/b)*y;
} inline int inv(int a,int b) {
int x,y;
return exgcd(a,b,x,y),(x%b+b)%b;
} int n,k,m[N],f[N][N]; int solve(int pos) {
if(pos<0) return 1; //!
int ret=0,cnt=0;
memset(f,0,sizeof f);
f[0][0]=1;
for(int i=1;i<=n;i++) {
if((m[i]>>pos)&1) {
++cnt;
f[cnt][0]=f[cnt-1][0]*(1<<pos)%mod; //!
for(int j=1;j<=cnt;j++) {
f[cnt][j]=f[cnt-1][j-1]*(m[i]%(1<<pos)+1)
+f[cnt-1][j]*(1<<pos);
f[cnt][j]%=mod;
}
}
else {
for(int j=0;j<=cnt;j++) {
f[cnt][j]=f[cnt][j]*(m[i]+1); //!
f[cnt][j]%=mod;
}
}
}
int r=inv(1<<pos,mod);
for(int j=(k>>pos&1);j<cnt;j+=2) {
ret+=f[cnt][j]*r;
ret%=mod;
}
if((cnt&1) == ((k>>pos)&1)) {
for(int i=1;i<=n;i++) {
if(m[i]>>pos&1) m[i]^=(1<<pos);
}
return (solve(pos-1) + ret)%mod;
}
else return ret;
} signed main() {
ios::sync_with_stdio(false);
while(cin>>n>>k) {
for(int i=1;i<=n;i++) cin>>m[i];
cout<<solve(31)<<endl;
}
}

Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp的更多相关文章

  1. Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分

    有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...

  2. Wannafly Winter Camp 2020 Day 5C Self-Adjusting Segment Tree - 区间dp,线段树

    给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区 ...

  3. Wannafly Winter Camp 2020 Day 5F Inversion Pairs - 拉格朗日插值,dp

    给定 \(n \leq 10^7\),求所有 \(n\) 的全排列的逆序对个数的 \(k \leq 100\) 次方和 Solution \(f[i][j]\) 表示 \(i\) 个元素,逆序对个数为 ...

  4. Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理

    有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...

  5. Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛

    杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...

  6. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

  7. Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元

    给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...

  8. Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流

    感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...

  9. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板

    #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...

随机推荐

  1. Java范型学习笔记

    对于范型的使用或者说印象只有集合,其他地方即使使用过也不知道,反正就是只停留在List<E> Map<K, V>,最近刚好闲来无事,就找找资料学习一下:下列为个人学习总结,欢迎 ...

  2. jmeter接口测试(登录、注册)

    Jmeter 进行接口测试流程: Jmeter 的下载地址:http://jmeter.apache.org/download_jmeter.cgi 下面举例说明使用流程,有两种参数传递的方式,我们以 ...

  3. Firewall 防火墙

    firewalld和iptables的关系: firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现.也就是说firewalld和iptables ...

  4. Linux设备中的UUID

    UUID简介 UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的.如果你在系统中启动的时候,使用盘符挂载时,可能找不到设备而加载失败,而使用UUID挂载时,则不会有这样的问题.( ...

  5. springmvc maven idea 多模块开发(三):建立子模块

    传统的多模块方式是建立domain.dao.service等,这种方式是按照软件架构进行分割,现在更多的应该是倾向按照功能来解耦,module前期可以配置成jar,后期也可以建立独有的页面,独立的站点 ...

  6. Mybatis注解开发多表一对一,一对多

    Mybatis注解开发多表一对一,一对多 一对一 示例:帐户和用户的对应关系为,多个帐户对应一个用户,在实际开发中,查询一个帐户并同时查询该账户所属的用户信息,即立即加载且在mybatis中表现为一对 ...

  7. SOLID原则都不知道,还敢说自己是搞开发的!

    面向对象编程(OOP)给软件开发领域带来了新的设计思想.很多开发人员在进行面向对象编程过程中,往往会在一个类中将具有相同目的/功能的代码放在一起,力求以最快的方式解决当下的问题.但是,这种编程方式会导 ...

  8. Android开发当中ListView的使用

    首先我们看ListView实现之后的的效果,如下图所示: 现在我们来看看如何来实现这个可以进行上下活动的ListView: 首先是主界面Activity_Main.xml的代码: <?xml v ...

  9. Maven 阿里云仓库地址

    https://maven.aliyun.com/mvn/view 一般使用聚合仓库(group),path是仓库地址.可点击右上角“使用指南”: 附   目前阿里云仓库的地址 https://mav ...

  10. The Ether 靶场

    0x01 首先对靶场进行端口扫描 发现只开启了80端口和22端口 0x02 目录扫描 访问了几个目录并没有什么发现 0x03 访问主页几个网站链接 发现了一个疑似文件包含的漏洞 0x04 抓包进行分析 ...