CodeForces 449D Jzzhu and Numbers 【DP+容斥】
来源:互联网 发布:北京淘宝纸箱 企业05 编辑:程序博客网 时间:2024/06/13 04:32
题意
给定一个n元集,元素为
分析
要是n和a的范围小一些自然可以直接用01背包做,然而这里a与n都达到了1e6的范围,则要另寻他法。
先求有多少种情况使得与出来的结果不为0,考察有多少元素在某些二进制位上为1,则它们与出来在这些位上也必然为1。 令函数
那么有了f(x)以后,就可以用容斥原理求出有多少种使得结果不为1的情况。再令
注意2的幂要减一,因为不能一个也不选。x的上限取到2e20,刚好比1e6大,能满足所有位。
这时再求为0的情况:
现在问题在于如何快速求得f(x)。先将每个a和x分为前k位和后20-k位两部分,
设状态:
转移方程:
显然dp[x][20]=f(x)
AC代码
//CodeForces 449D Jzzhu and Numbers//AC 2017-1-19 14:21:28//DP, Inclusion-exclusion#include <bits/stdc++.h>using namespace std;const int mod=1e9+7;const int maxn=1e6+100;int n;int a[maxn];int dp[(1<<21)][21];long long powmod(long long x,long long y,long long m){ long long z=x%m; if(!y) return 1; if(y&1) return z*powmod(z*z,(y-1)/2,m)%m; else return powmod(z*z,y/2,m)%m;}int main(){ scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",a+i); for(int i=0;i<n;++i) ++dp[a[i]][0]; for(int i=1;i<21;++i) { for(int j=0;j<(1<<21);++j) { if((j>>(i-1))&1) dp[j][i]=dp[j][i-1]; else dp[j][i]=dp[j][i-1]+dp[j+(1<<(i-1))][i-1]; } } long long ans=0; for(int i=0;i<(1<<21);++i) { long long cur=powmod(2,dp[i][20],mod)-1; if(__builtin_popcount(i)&1) cur=-cur; ans+=cur+mod; ans%=mod; } cout<<ans<<endl; return 0;}
0 0
- codeforces 449D Jzzhu and Numbers 容斥+DP
- CodeForces 449D Jzzhu and Numbers 【DP+容斥】
- codeforces 449 D Jzzhu and Numbers(容斥+dp)
- CodeForces 449 D.Jzzhu and Numbers(状压DP+容斥原理)
- CodeForces 449D Jzzhu and Numbers
- 449 D. Jzzhu and Numbers
- Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers
- CodeForces 342D Xenia and Dominoes 【DP+容斥】
- Codeforces 449B - Jzzhu and Cities / 450D - Jzzhu and Cities
- 【高维前缀和+容斥】Codeforces449D[Jzzhu and Numbers]题解
- [数位dp] Codeforces 401D Roman and Numbers
- Codeforces 401D Roman and Numbers【状压dp】
- Codeforces 401D Roman and Numbers 状压DP
- CodeForces 401D Roman and Numbers【数位dp+状态压缩】
- codeforces 401D Roman and Numbers (数位dp)
- 【杂题】 codeforces 449A Jzzhu and Chocolate
- Codeforces 449 B. Jzzhu and Cities
- CodeForces 449-A. Jzzhu and Chocolate
- android_知识整理
- elasticsearch插入数据
- POJ 3729 求f(x) = K的数量转化为求两个大于等于的差 + 刘汝佳后缀数组模板的细节
- Android之ListView详解
- 信号量与生产者消费者问题
- CodeForces 449D Jzzhu and Numbers 【DP+容斥】
- 安卓布局 - 相对布局(RelativeLayout)
- 剑指offer-面试题22-栈的压入、弹出序列
- ScrollView嵌套ListView,GridView,RecyclerView以及RecyclerView嵌套RecyclerView显示不全的解决方法
- Angular.js中使用$watch监听模型变化
- android基础--canvas绘图
- TypeScript入门-3.参数类型
- 全文检索原理
- Gitlab 批量创建用户