容斥 51nod 1407 與與與與

2021-10-09 14:45:08 字數 1354 閱讀 6385

這道題的方向不是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 操作後的位數來確定容斥係數。

考慮 and

\mathrm

and 後位數至少 k

kk 的答案,假設有 f

xf_x

fx​個數的其中乙個子集為x

xx,那麼把這些數 and

andan

d 以後,這些值至少為 x

xx ,而這些方案恰好是至少有cnt

xcnt_x

cntx

​位的貢獻。

因此答案為:∑x(

−1)c

ntx×

(2fx

−1)\sum_ (-1)^\times (2^-1)

x∑​(−1

)cnt

x​×(

2fx​

−1)f

xf_x

fx​ 的求解方法參考這篇精美部落格哦!

#include

#define int long long

using

namespace std;

const

int n =

2100000

;const

int p =

1e9+7;

int n;

int power[n]

, f[n]

, cnt[n]

;int

read

(void

)void

work

(void

) res =

(res % p + p)

% p;

cout << res << endl;

return;}

signed

main

(void

)while

(cin >> n)

work()

;return0;

}

51nod1407 與與與與 容斥 DP

有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的答案,我們容斥一下就能得...

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