有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...