這道題的方向不是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...