bzoj5306 NTT 容斥原理 染色

2021-09-11 19:51:20 字數 3633 閱讀 4025

description

傳送門

題解

upd:原來這是二項式反演來著qwq…

貼一下容斥題的一點點做法.

首先顯然先求方案數g[i

]g[i]

g[i]

表示只有i

ii種出現了s

ss次的方案數

那怎麼說也要求乙個f[i

]f[i]

f[i]

表示至少有i

ii種出現了s

ss次的方案數

f [i

]=cm

i∗cn

i∗s∗

(i∗s

)!in

v[s]

i∗(m

−i)n

−i∗s

f[i]=c_m^i*c_n^*\frac*(m-i)^

f[i]=c

mi​∗

cni∗

s​∗i

nv[s

]i(i

∗s)!

​∗(m

−i)n

−i∗s

i nv

[s]inv[s]

inv[s]

表示s !s!

s!的逆元我們寫一下乙個東西,豎行表示g

gg,橫行表示f

注意到這是乙個倒三角

中間的東西表示會被算幾次

那麼 後面的係數是可以從上一行推下來的

要記住容斥的這種推係數做法啊

那麼式子就有了

g [i

]=∑j

=i(−

1)j−

i∗cj

i∗f[

j]g[i]=\sum_ (-1)^*c_j^i*f[j]

g[i]=j

=i∑​

(−1)

j−i∗

cji​

∗f[j

]把組合數拆開

g [i

]=∑j

=i(−

1)j−

i∗j!

i!(j

−i)!

∗f[j

]g[i]=\sum_(-1)^*\frac*f[j]

g[i]=j

=i∑​

(−1)

j−i∗

i!(j

−i)!

j!​∗

f[j]

把i !i!

i!移項,j!j!

j!扔到f [j

]f[j]

f[j]

裡面可以知道

g [i

]∗i!

=∑j=

i(−1

)j−i

(j−i

)!∗f

[j]∗

j!g[i]*i!=\sum_\frac}*f[j]*j!

g[i]∗i

!=j=

i∑​(

j−i)

!(−1

)j−i

​∗f[

j]∗j

!後面那個項把(−1

)j−i

(j−i

)!\frac}

(j−i)!

(−1)

j−i​

反項,就可以直接卷積求出來了

注意預處理的複雜度要壓到max

(n,m

)max(n,m)

max(n,

m)不然bz會跪…

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

#define pll pair

#define pii pair

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int stack[20]

;inline

void

write

(int x)if(

!x)int top=0;

while

(x)stack[

++top]

=x%10

,x/=10;

while

(top)

putchar

(stack[top--]+

'0');}

inline

void

pr1(

int x)

inline

void

pr2(

int x)

const

int mod=

1004535809

;const

int maxn=

100005

;const

int maxm=

10000005

;int

pow_mod

(int a,

int b)

return ret;

}int a[maxn*4]

,b[maxn*4]

;int r[maxn*4]

,l,ln;

void

ntt(

int*y,

int len,

int on)}}

if(on==-1

)}int pre[maxm]

,inv[maxm]

;intc(

int n,

int m)

int n,m,s,w[maxn]

;voidad(

int&x,

int y)

intmain()

else

break;}

for(

int i=

0;i<=m;i++

)ntt

(a,ln,1)

;ntt

(b,ln,1)

;for

(int i=

0;i)a[i]

=1ll

*a[i]

*b[i]

%mod;

ntt(a,ln,-1

);int ans=0;

for(

int i=m;i<=2*

(m+1)-

1;i++

)pr2

(ans)

;return0;

}

bzoj 3622 容斥原理

題意 給出有n個元素的集合a和集合b,所有2n個元素互不相同,求將a集合中的元素和b集合中的元素兩兩配對,使a的元素大於b中元素的對數恰為n k2對。設f i j 表示a中的前i個元素配對後至少有j對滿足a的元素大於b中元素。那麼先將a和b排序,設ne x i 表示b中最後乙個小於a中i元素的位置。...

HAOI 2018 染色(容斥 NTT)

設 f k 為強制選擇 k 個顏色出現 s 種,其餘任取的方案數。則有 f k m k 不難看出,這個方案可能包括了超過 k 種顏色,也有重複的方案,所以恰有 k 個顏色出現 s 種的方案 ans k 滿足 ans k sum 1 f i 最終化簡得到 ans k sum i f i cdot ov...

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...