[ABC262E] Red and Blue Graph
Problem Statement
You are given a simple undirected graph with $N$ vertices and $M$ edges. The vertices are numbered $1, \dots, N$, and the $i$-th $(1 \leq i \leq M)$ edge connects Vertices $U_i$ and $V_i$.
There are $2^N$ ways to paint each vertex red or blue. Find the number, modulo $998244353$, of such ways that satisfy all of the following conditions:
- There are exactly $K$ vertices painted red.
- There is an even number of edges connecting vertices painted in different colors.
Constraints
- $2 \leq N \leq 2 \times 10^5$
- $1 \leq M \leq 2 \times 10^5$
- $0 \leq K \leq N$
- $1 \leq U_i \lt V_i \leq N \, (1 \leq i \leq M)$
- $(U_i, V_i) \neq (U_j, V_j) \, (i \neq j)$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$ $M$ $K$ $U_1$ $V_1$ $\vdots$ $U_M$ $V_M$
Output
Print the answer.
Sample Input 1
4 4 2 1 2 1 3 2 3 3 4
#include<cstdio>
const int N=2e5+5,P=998244353;
int n,m,k,in[N],jc[N],c1,c0,u,v,ans;
int pow(int x,int y)
{
if(!y)
return 1;
int t=pow(x,y>>1);
if(y&1)
return 1LL*t*t%P*x%P;
return 1LL*t*t%P;
// return (y&1)? 1LL*t*t%P*x%P:1LL*t*t%P;
}
int calc(int x,int y)
{
if(x<y)
return 0;
return 1LL*jc[x]*pow(jc[y],P-2)%P*pow(jc[x-y],P-2)%P;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=jc[0]=1;i<=n;i++)
jc[i]=1LL*jc[i-1]*i%P;
// printf("%d\n",pow(2,10)%P);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
in[u]++,in[v]++;
}
for(int i=1;i<=n;i++)
in[i]&1? c1++:c0++;
// printf("%d %d\n",c1,c0);
for(int i=0;i<=k;i+=2)//选多少个奇数的
{
// printf("%d %d %d\n",i,calc(c1,i),calc(c0,k-i));
ans+=1LL*calc(c1,i)*calc(c0,k-i)%P;
ans%=P;
}
printf("%d",ans);
}