1. 程式人生 > >51nod 1407 與與與與 dp+容斥原理

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。
那麼根據容斥原理,答案顯然為220x=0(1)cnt(x)(2f(x)1)
現在考慮如何求出所有的f(x)。
fk(x)表示有多少個i滿足對於前k個二進位制位a[i]&x=x,對於剩餘的二進位制位而言,a[i]=x。
根據定有不難得到遞推式:
若x的第k位為1則fk(x)=fk1(x)
反之則f

k(x)=fk1(x)+fk1(k+2k)
那麼就可以在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~nx互質的數的個數(6個題、原理

HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的

原理求1到nk互質個數

參考部落格:傳送門 此處的k<=1e9、 #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #include<vecto