51nod1407 與與與與 容斥 DP

2021-09-13 04:10:48 字數 1162 閱讀 1842

有n個整數,問從他們中取出若干個數字相與之後結果是0的有多少組。

答案比較大,輸出對於 1,000,000,007 (1e9+7)取模後的結果。

n ≤1

06ai

≤106

n\le10^6\\a_i\le10^6

n≤106a

i​≤1

06很容易想到設f[i]表示至少i個位置不為0的答案,我們容斥一下就能得到恰好i個位置不為0的答案,最終結果就是恰好0個位置不為0了

這裡設g[x]表示二進位制中含有x這個子集的元素數量,轉移的時候可以像揹包一樣限制最高位就不會算重了

於是就可以用g算出f了

#include

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define drp(i,st,ed) for (int i=st;i>=ed;--i)

typedef

long

long ll;

const

int mod=

1000000007

;const

int n=

2000005

;ll f[n]

,c[n]

,pow[n]

;int

read()

void

upd(ll &x,ll v)

intmain

(void)}

// for (int i=0;i<(1<<20);++i) printf("%lld\n", f[i]);

rep(i,0,

(1<<20)

-1) c[i]

=c[i>>1]

+(i&1)

; pow[0]

=1;rep

(i,1,(

1<<20)

) pow[i]

=(pow[i-1]

+pow[i-1]

)%mod;

ll ans=0;

rep(i,0,

(1<<20)

-1)printf

("%lld\n"

, ans)

;return0;

}

容斥 51nod 1407 與與與與

這道題的方向不是o n o n o n 而是 o v o v o v 我們發現答案為 全集 an d mathrm and 有至少 1 11 位 0 00 的 an d mathrm and 後有至少 2 22 位 0 00 的 因此我們可以根據乙個數字 and mathrm and 操作後的位數來...

51Nod1407 與與與與

有n個整數,問從他們中取出若干個數字相與之後結果是0的有多少組。答案比較大,輸出對於 1,000,000,007 1e9 7 取模後的結果。input 第一行輸入乙個整數n。1 n 1,000,000 第二行有n個整數a 0 a 1 a 2 a n 1 以空格分開.0 a i 1,000,000 o...

51NOD 2 3 5 7的倍數(容斥原理)

似乎最近沒怎麼做容斥原理啊,來複習一發概念。容斥原理公式 一般做法都是先搞乙個式子出來,再列舉所有子集,用式子來確定符號和子集的關係。小學生容斥。1 2 eye!3 mind!4 5 6 7 8 9 10 11 12 13 14 15 16 17 include 18 include 19 incl...