51nod 1407 與與與與 dp+容斥原理
題意
有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;
}
相關推薦
51nod 1407 與與與與 dp+容斥原理
題意 有n個整數,問從他們中取出若干個數字相與之後結果是0的有多少組。 答案比較大,輸出對於 1,000,000,007 (1e9+7)取模後的結果。 1<=n<=1,000,000,
洛谷 P2986 [USACO10MAR]Great Cow Gat…(樹形dp+容斥原理)
nco more printf ide eva gre ans names get P2986 [USACO10MAR]偉大的奶牛聚集Great Cow Gat… 題目描述 Bessie is planning the annual Great Cow G
【bzoj3782】上學路線 dp+容斥原理+Lucas定理+中國剩余定理
只需要 輸出 容斥 題解 質數 不為 上學路線 sort 短路徑 題目描述 小C所在的城市的道路構成了一個方形網格,它的西南角為(0,0),東北角為(N,M)。小C家住在西南角,學校在東北角。現在有T個路口進行施工,小C不能通過這些路口。小C喜歡走最短的路徑到達目的地,因
BZOJ-1042: [HAOI2008]硬幣購物 (背包DP+容斥原理)
turn content discus 其中 n) 每次 scu pac ref 1042: [HAOI2008]硬幣購物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2888 Solved: 1777[Submit]
4455: [Zjoi2016]小星星|狀壓DP|容斥原理
out var -s mod ati cto cout erl ber OrzSDOIR1ak的晨神 能夠考慮狀壓DP枚舉子集,求出僅僅保證連通性不保證一一相應的狀
BZOJ 2669 CQOI2012 局部極小值 狀壓dp+容斥原理
子集 lib 狀壓dp void color 一次 不出 等你 vector 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 題意概述:實際上原題意很簡潔了我就不寫了吧。。。。 二話不說先觀察一下性
【題解】[牛客網NOIP賽前集訓營-提高組(第二場)]B.分糖果 單調棧優化線性DP+容斥原理
題目連結 #include<cstdio> #define re register typedef long long ll; const int N=1e6+10; const int INF=0x3f3f3f3f; const int mod=1e9
[bzoj3622][DP][容斥原理]已經沒有什麼好害怕的了
Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30
[bzoj1042][DP][容斥原理]硬幣購物
Description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。 Inp
Hdu 4336 Card Collector (狀態概率DP|容斥原理)
詳細的題目大意與解析大家參考一下kuangbin的文章。 這邊說一下自己對於kuangbin程式碼以及容斥原理位元素列舉的理解與解釋,希望對大家有所幫助。 狀態DP AC程式碼:狀態壓縮的思想我就不贅述了,我也只是略懂,這邊僅僅分析一下狀態方程 由於量比較多,我這邊有的便
容斥原理解決某個區間[1,n]閉區間與m互質數數量問題
除法 als tdi pla cin ack 二分 ans || 首先貼出代碼(閉區間[1,n]範圍內和m互質的數) 代碼: int solve(II n,II m){ vector<II>p; for(II i=2;i*i<=m;i++
[轉]容斥原理與多重集合{理論}
csdn 描述 ref 兩個 一個 情況 uri 16px blog 本文轉自http://blog.csdn.net/ACdreamers/article/details/9923955 原博主:ACdreamers 首先介紹一個重要定理: 設S是有k種類型對象的多重集合
hdu 4135 a到b的範圍中多少數與n互質(容斥)
namespace rim 所有 += ont put contain 質因數 tor Co-prime 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4135 input
0x37 容斥原理與莫比烏斯函數
int sizeof can pre long break true 容斥 組合 多重集的組合數公式得記下。cf451E就是這個的裸題 #include<cstdio> #include<iostream> #include<cs
求N(10^14)以內與N互質的數的和(容斥原理,或者尤拉函式)
#include <iostream> #include <cstring> #include <algorithm> #include <cmath>
acm組合數學及其應用--容斥原理與鴿巢原理(一)
acm組合數學及其應用–容斥原理與鴿巢原理 追逐青春的夢想,懷著自信的心,永不放棄 1、容斥原理 定理一(德摩根定理) 若A和B是全集U的子集, 1、則A和B並集的補集等於A的補集與B的補集的交集 2、則A和B交集的補集等於A的補集
容斥原理 —— 求1~n有多少個數與k互質(二進位制演算法詳細解釋&模板)
這裡有一道經典的例題,可以看一下:點選開啟連結 這裡的n可能要大於k的,所以不能用尤拉函式去做。 我們首先把k分解質因數,儲存到p陣列中,num表示質因子的數量。 void pr(int k) //求k的質因子 { num = 0; for (int i = 2 ;
【容斥原理-求區間內與n互質的數】HDOJ Co-prime 4135
Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N. Two integers are said to be co-
求1~n與x互質的數的個數(6個題、容斥原理)
HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的
容斥原理求1到n與k互質個數
參考部落格:傳送門 此處的k<=1e9、 #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #include<vecto