E - Red and Blue Graph(组合数学)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Red and Blue Graph(组合数学)相关的知识,希望对你有一定的参考价值。

E - Red and Blue Graph(组合数学)

因为要求有偶数个不同颜色的边。

记不同颜色的边个数为 x x x,颜色全为红色的边个数为 y y y

则红色的点度数之和为: 2 y + x = s 2y+x=s 2y+x=s

x , s x,s x,s 奇偶性相同。

s s s 的奇偶性,只取决于度数为奇数的红点个数。

因此枚举红色点中度数为奇数的个数即可,剩下在度数为偶数里选。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
const ll mod=998244353;
int n,m,k,d[N],num[2];ll inv[N],fac[N],ans;
ll C(int n,int m)

	if(n<m||m<0) return 0ll;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;

int main()

	scanf("%d %d %d",&n,&m,&k);
	for(int i=1,u,v;i<=m;i++)
		scanf("%d %d",&u,&v),d[u]++,d[v]++;
		
	fac[0]=inv[1]=inv[0]=1;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	for(int i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i<=n;i++) inv[i]=inv[i]*inv[i-1]%mod;
	
	for(int i=1;i<=n;i++)
		num[d[i]&1]++;
	for(int i=0;i<=num[1];i+=2)	//度数为奇数的个数必须为偶数个
		ans=(ans+C(num[1],i)*C(num[0],k-i))%mod;
	printf("%lld",ans);
  

以上是关于E - Red and Blue Graph(组合数学)的主要内容,如果未能解决你的问题,请参考以下文章

E - Red and Blue Graph(组合数学)

E - Red and Blue Tree(计数&背包)

AtCoder Grand Contest 014 E:Blue and Red Tree

AGC 014E.Blue and Red Tree(思路 启发式合并)

ABC222 E - Red and Blue Tree(思维+dp)

AGC 014 E Blue and Red Tree [树链剖分]