水果拼盤(反演求容斥係數)

2021-08-24 23:21:47 字數 2879 閱讀 2355

出題人本意是考反演,結果沒學好期望線性可加。

最近一直在練容斥反演,所以一看就上容斥反演。設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...