日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

容斥原理及证明

發(fā)布時(shí)間:2024/4/24 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 容斥原理及证明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

定理

設(shè)共有(n)個(gè)集合,(A_i)表示第(i)個(gè)集合,則所有集合的并集可表示成以下形式:

[|A_1cup A_2cup cdotscup A_n|=sum_{i=1}^n (-1)^{i-1}sum|A_1cap A_2capcdotscap A_i|
]

證明

設(shè)某個(gè)元素被(x)個(gè)集合包含,顯然地,其對(duì)左式的貢獻(xiàn)為1,因?yàn)樵诓⒓兄挥?jì)算一次。
考慮其對(duì)于右式的貢獻(xiàn),它會(huì)在這(x)個(gè)集合的所有子集中被計(jì)算到。其貢獻(xiàn)為:

[sum_{i=1}^x C_x^i(-1)^{i-1}=-sum_{i=1}^x C_x^i(-1)^{i}=1-sum_{i=0}^x C_x^i(-1)^{i}=1-sum_{i=0}^x C_x^i(-1)^{i} imes1^{x-i}=1-(1-1)^x=1
]

由于所有元素對(duì)于左右兩式的貢獻(xiàn)均為1,綜上即可證得等式成立。

推論

設(shè)(A_i^c)表示(A_i)的補(bǔ)集,(S)表示全集,則:

[|A_1^ccap A_2^ccapcdotscap A_n^c|=|S|-|A_1cup A_2cup cdotscup A_n|=|S|-sum_{i=1}^n (-1)^{i-1}sum|A_1cap A_2capcdotscap A_i|
]

常用于解決限制條件較繁復(fù)的問(wèn)題。

相關(guān)練習(xí)

[JSOI2015]染色問(wèn)題

題解

[click]

這三個(gè)限制可以逐個(gè)來(lái)解決,然后逐層相乘。
當(dāng)至少有(i)行(j)列不染色的規(guī)定為某(i)行(j)列不染色的時(shí)候,設(shè)(f_k)表示不用(k)種顏色的方案。
則:

[inom{c}{k}(c-k+1)^{(n-i)(m-j)}=sum_{t=k}^c inom{t}{k} f_t
]

左式的意義為,選(k)個(gè)顏色不用的方案數(shù)。由于還有不涂色的選擇,所以并不能保證只有那幾個(gè)沒(méi)有用到。假設(shè)有一種方案恰好有(t)種顏色沒(méi)用到,根據(jù)這樣的選擇方式,它就被計(jì)算了(inom{t}{k})次。由此得出上式。
二項(xiàng)式反演一下,或者從單純的容斥角度而言,即可得到:

[f_k=sum_{t=k}^c (-1)^{t-k}inom{t}{k}inom{c}{t}(c-t+1)^{(n-i)(m-j)}
]

[egin{align*}
sum_{k=1}^c f_k& =sum_{k=1}^c sum_{t=k}^c (-1)^{t-k}inom{t}{k}inom{c}{t}(c-t+1)^{(n-i)(m-j)}\
& =sum_{t=1}^c inom{t}{k}inom{c}{t}(c-t+1)^{(n-i)(m-j)} sum_{k=1}^t (-1)^{t-k}inom{t}{k}\
& =sum_{t=1}^c inom{t}{k}inom{c}{t}(c-t+1)^{(n-i)(m-j)} (-(-1)^t +sum_{k=0}^t (-1)^{t-k}1^k inom{t}{k})\
& =sum_{t=1}^c (-1)^{t+1}inom{c}{t}(c-t+1)^{(n-i)(m-j)}\
end{align*}]

合法的方案數(shù)即為:

[(c+1)^{(n-i)(m-j)}-sum_{k=1}^c f_k=sum_{k=0}^c (-1)^kinom{c}{k} (c-k+1)^{(n-i)(m-j)}
]

這樣的方案數(shù),還是會(huì)算重,同樣因?yàn)橛胁煌可倪x擇會(huì)導(dǎo)致超過(guò)(i)行或(j)列是完全空白的。再進(jìn)行容斥,即可得到:

[egin{align*}
& sum_{i=0}^n (-1)^i inom{n}{i}sum_{j=0}^m (-1)^j inom{m}{j} sum_{k=0}^c (-1)^kinom{c}{k}(c-k+1)^{(n-i)(m-j)}\
& =sum_{i=0}^nsum_{k=0}^c (-1)^{i+k}inom{n}{i} inom{c}{k}sum_{j=0}^m inom{m}{j}(-1)^j(c-k+1)^{(n-i)(m-j)}\
& =sum_{i=0}^nsum_{k=0}^c (-1)^{i+k}inom{n}{i} inom{c}{k}sum_{j=0}^m [-1+(c-k+1)^{n-i}]^m \
end{align*}]

如果不將后面的求和轉(zhuǎn)化掉的話,復(fù)雜度是(O(n^3))。轉(zhuǎn)化后對(duì)每一個(gè)(c-k+1)的冪進(jìn)行預(yù)處理,即可達(dá)到(O(n^2logn))的復(fù)雜度。

代碼

[click]
#include <cstdio>
#include <cctype>
typedef long long ll;
const int p=1e9+7;
const int maxn=400+10;
int fac[maxn],inv[maxn],pow[maxn*maxn];

int max(int x,int y) {return x>y?x:y;}
int read()
{
	int res=0;
	char ch=getchar();
	while(!isdigit(ch))
		ch=getchar();
	while(isdigit(ch))
		res=res*10+ch-'0',ch=getchar();
	return res;
}
int power(int a,int n)
{
	int res=1;
	while(n)
	{
		if (n&1)
			res=(ll)res*a%p;
		a=(ll)a*a%p;
		n>>=1;
	}
	return res;
}
void prework(int n)
{
	fac[0]=1;
	for (int i=1;i<=n;i++)
		fac[i]=(ll)fac[i-1]*i%p;
	inv[n]=power(fac[n], p-2);
	for (int i=n-1;i>=0;i--)
		inv[i]=(ll)inv[i+1]*(i+1)%p;
}
int C(int n,int m)
{
	if (m>n)
		return 0;
	return (ll)fac[n]*inv[m]%p*inv[n-m]%p;
}
int main()
{
	int n=read(),m=read(),c=read();
	prework(max(max(n, m), c));
	int ans=0;
	pow[0]=1;
	for (int k=0;k<=c;k++)
	{
		for (int i=1;i<=n;i++)
			pow[i]=(ll)pow[i-1]*(c-k+1)%p;
		for (int i=0;i<=n;i++)
		{
			int mul=(ll)power(pow[n-i]-1, m)*C(n, i)%p*C(c, k)%p;
			if ((i^k)&1)
				ans-=mul;
			else
				ans+=mul;
			if (ans<0)
				ans+=p;
			else if (ans>=p)
				ans-=p;
		}
	}
	printf("%d
",ans); 
	return 0;
}

總結(jié)

以上是生活随笔為你收集整理的容斥原理及证明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。