51nod 1407 与与与与 dp+容斥原理
来源:互联网 发布:js点击增加div 编辑:程序博客网 时间:2024/05/02 04:37
题意
有n个整数,问从他们中取出若干个数字相与之后结果是0的有多少组。
答案比较大,输出对于 1,000,000,007 (1e9+7)取模后的结果。
1<=n<=1,000,000,0<=a[i]<=1,000,000
分析
我们设f(x)表示有多少个i满足a[i]&x=x。
那么根据容斥原理,答案显然为
现在考虑如何求出所有的f(x)。
设
根据定有不难得到递推式:
若x的第k位为1则
反之则
那么就可以在O(nlogn)的时间内算出f(x)。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int N=1100005;const int MOD=1000000007;int n,bin[25],f[25][N],pow[N],cnt[N];int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int main(){ bin[0]=1; for (int i=1;i<=20;i++) bin[i]=bin[i-1]*2; n=read(); for (int i=1;i<=n;i++) { int x=read(); if (!(x&1)) f[0][x]++; else f[0][x]++,f[0][x^1]++; } for (int i=1;i<20;i++) for (int j=0;j<bin[20];j++) if (j&bin[i]) f[i][j]=f[i-1][j]; else f[i][j]=f[i-1][j]+f[i-1][j^bin[i]]; for (int i=1;i<bin[20];i++) cnt[i]=cnt[i>>1]+(i&1); pow[0]=1; for (int i=1;i<=n;i++) pow[i]=pow[i-1]*2,pow[i]-=pow[i]>=MOD?MOD:0; LL ans=0; for (int i=0;i<bin[20];i++) if (cnt[i]&1) (ans-=pow[f[19][i]]-1)%=MOD; else (ans+=pow[f[19][i]]-1)%=MOD; ans+=ans<0?MOD:0; printf("%lld",ans); return 0;}
阅读全文
0 0
- 51nod 1407 与与与与 dp+容斥
- 51nod 1407 与与与与 dp+容斥原理
- 51Nod - 1407 容斥原理 + dp
- 51nod 1687 lyk与gcd 状态压缩+容斥原理+质因数分解+
- 51nod 1407 与与与与
- 二进制与容斥原理
- 【51nod 球与切换器】+ dp
- 51nod 排列与交换 序列dp
- 容斥原理与多重集合
- 容斥原理与多重集合
- 容斥原理基本概念与例题
- 51nod oj 1678 lyk与gcd 【容斥定理+打表】
- 51NOD 1678 lyk与gcd(容斥+素数筛)
- BZOJ 1042: [HAOI2008]硬币购物 DP,与处理,容斥
- [DP] 51Nod 1293 球与切换器
- 51nod 1406 与查询 类背包dp
- HDU4135容斥原理递归与非递归版
- GCD and LCM 质因数分解与容斥原理
- vim的tab设定
- 大白话【websocket】原理
- hadoop系列教程第二讲:环境搭建
- 支付宝又出黑科技,停车场不停车通过
- 微软发布语音输入插件,支持超过20种语言,还能实时翻译
- 51nod 1407 与与与与 dp+容斥原理
- 腾讯NOW直播:不着急赚钱 内容生态更重要
- Laravel 中各种Url带参数传递
- netty源码学习一(Serverbootstrap引导程序)
- SSH整合(XML版本)
- 报名:“万物一听”讯飞开放平台智能硬件新品发布会开幕在即
- 如何学好c语言
- 上市3个月以来,Snap股票首次跌至17美元发行价
- 苹果宜家联手打造AR应用,让用户预览家具在屋中的摆放效果