容斥原理演算法總結 bzoj 2986 2839

2022-07-17 06:39:08 字數 1559 閱讀 3687

容斥原理是乙個從小學就開始學習的演算法。但是很多難題現在都覺得做的十分吃力。

容斥原理大概有兩種表現形式,一種是按照倍數進行容斥,這個東西直接用莫比烏斯函式就可以了。

#include#include

#include

#include

using

namespace

std;

#define maxn 200100typedef

long

long

qword;

bool

pflag[maxn];

int prime[maxn],topp=-1

;int

mu[maxn];

inta[maxn],tota;

intb[maxn],totb;

void

init()

for (register int j=0;j<=topp && i*prime[j])

mu[i*prime[j]]=-mu[i];}}

}int

main()

printf(

"%lld\n

",r);

}

bzoj 2986

另一種可以理解為乙個乙個遞推,按照+/-1容斥。

bzoj 2839 : 乙個有n個元素的集合有2^n個不同子集(包含空集),現在要在這2^n個集合中取出若干集合(至少乙個),使得它們的交集的元素個數為k,求取法的方案數,答案模1000000007。(是質數喔~)

這道題雖然說懂了正解,但是還是沒有弄清楚最初的做法為什麼錯了。

考慮求大於等於i的方案數,可理解為從n個選出i個,再在另n-i個裡面任意選擇,由於答案的k個肯定屬於這i個,所以容斥時再乘上係數c(i,k),直接容斥即可。

這種題如果方法有問題其實是很難檢查出來的,最好的方法是寫暴力或者用另一種思路寫。

#include#include

#include

#include

using

namespace

std;

#define maxn 1000100

#define mod 1000000007typedef

long

long

qword;

qword fact[maxn];

qword pow_mod(qword x,qword y)

return

ret;

}qword finv[maxn];

#define c(x,y) (fact[x]*finv[y]%mod*finv[(x)-(y)]%mod)

intmain()

//ans=h[m]*c(n,m);

printf("

%lld\n

",ans);

}

bzoj 2839

bzoj 1042:硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。

很早以前做的一道經典題目,其思路很有借鑑意義。

演算法總結 容斥原理01

容斥原理是大學離散數學裡的應用,就算沒學過也能理解。畢竟,在程式設計師眼中,排列組合是不會有多麼離散的。題目直接看題 devu有n個盒子,第i個盒子中有ai枝花。同乙個盒子內的花顏色相同,不同盒子內的花顏色不同。devu要從這些盒子中選出m枝花組成一束,求共有多少種方案。若兩束花每種顏色的花的數量都...

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元素的位置。...

總結 容斥原理與反演

這個是個好東西.實際上,容斥和反演沒有什麼區別。目錄 題解 cf997c sky full of stars 題解 cf451e devu and flowers 容斥 題解 cjoi2019 登峰造雞境 prufer序列 斯特林數 題解 cf559c c.gerald and giant ches...