出題人本意是考反演,結果沒學好期望線性可加。
最近一直在練容斥反演,所以一看就上容斥反演。設f
(s) f(s
)表示選的水果的集合是s的方案數,g(
s′) g(s
′)表示選的水果是s』的子集的方案數。顯然g
(s′)
g (s
′)是非常好算的,記cn
t cnt
表示拼盤裡的水果都屬於s』集的拼盤的個數,則g(
s′)=
ckcn
t g(s
′)=c
cntk
f f
和g' role="presentation" style="position: relative;">g
g的關係是g(
s′)=
∑s∈s
′f(s
) g(s
′)=∑
s∈s′
f(s)
根據反演套路,設容斥係數為
h h
則f(s)=∑
s′∈s
g(s′
)∗h(
s′)' role="presentation" style="position: relative;">f(s
)=∑s
′∈sg
(s′)
∗h(s
′)f(
s)=∑
s′∈s
g(s′
)∗h(
s′)
其中h(s
′)h (s
′)為乙個和s』有關的函式,展開
g g
得:f(
s)=∑
s′∈s
h(s′
)∑s″
∈s′f
(s″)
' role="presentation" style="position: relative;">f(s
)=∑s
′∈sh
(s′)
∑s′′∈
s′f(
s′′)f
(s)=
∑s′∈
sh(s
′)∑s
″∈s′
f(s″
)f(s
)=∑s
′′∈sf
(s′′)
∑s′′∈
s′∈s
h(s′
) f(s
)=∑s
″∈sf
(s″)
∑s″∈
s′∈s
h(s′
)使h(s′)
=(−1
)|s′
| h(s
′)=(
−1)|
s′|,再把求出的f(
s)f (s
)也乘上(−
1)|s
| (−1
)|s|
既可以得到
f f
,後面就簡單了。
暴力列舉是會超時的,所以用寬搜+狀壓dp優化轉移。
code:
#include
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define min(a, b) ((a) < (b) ? (a) : (b))
#define fu(a) ((a) & 1 ? -1 : 1)
using
namespace
std;
const
int mo = 998244353;
int n, m, k, x, y, a[20], b[20], a2[20], bz[100005];
ll c[100005][26], g[1
<< 18], f[1
<< 18][19], h[1
<< 18], ans;
ll ksm(ll x, ll y)
int main()
fo(i, 1, m) scanf("%d", &a[i]);
fo(i, 1, m) scanf("%d", &b[i]);
fo(i, 1, n)
f[bz[i]][0] ++;
}fo(i, 0, a2[m] - 1)
int s1 = 0; fo(j, 0, m - 1) s1 += (i & a2[j]) > 0;
fo(j, 0, m) g[i] += f[i][j];
g[i] = c[g[i]][k] * fu(s1);
}memset(f, 0, sizeof f);
fo(i, 0, a2[m] - 1) f[i][0] += g[i];
fo(i, 0, a2[m] - 1)
int s1 = 0; fo(j, 0, m - 1) s1 += (i & a2[j]) > 0;
fo(j, 0, m) h[i] += f[i][j];
h[i] = (h[i] * fu(s1) % mo + mo) % mo;
ll s = 0;
fo(j, 0, m - 1) if(i & a2[j])
s += a[j + 1]; else s += b[j + 1];
ans = (ans + h[i] * (s % mo)) % mo;
}ans = ans * ksm(c[n][k], mo - 2) % mo;
printf("%lld", ans);
}
容斥原理,反演
大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...
容斥與反演總結
容斥和反演就是乙個東西。a 1 a2 an i 1n 1 n i t i,t a x1 a x2 a xi 直接列舉所有子集計算。例題 bzoj4455 坑待填。就是有兩個式子。gn i 0nan ifi fn i 0 nbn,igi 把下式帶入上式 gn i 0nan i j 0ib i,jg j...
容斥原理,容斥係數
眾所周知,容斥原理是計數問題中最雞賊的東西 基本上很多計數問題都要用到容斥,但是有的時候你明明知道要容斥就是不知道怎麼容斥 所以特此寫在這裡總結一下 一般來說,這種容斥原理一般有n個性質,滿足第 i 個性質的元素集合為 a i 還有乙個全集 u 現在我們需要統計 ans u bigcap overl...