[atARC115D]Odd Degree
考虑对于一棵树$G$,这个问题的答案——
当$k$为奇数时答案显然为0,否则从$V$中任选$k$个点,以任意一点为根,从底往上不难发现子图数量唯一
换言之,当$k$为偶数时,每一个合法(恰有$k$个奇度数的点)子图恰好对应于一种选择方案,即${|V|\choose k}$
当$G$是一张连通图时,继续来分析答案——
首先$k$仍要是偶数,且仍然考虑任选$k$点,并求出其一棵生成树
对于生成树以外的边,任意选每一条边是否加入子图,之后同样可以通过这棵生成树构造出一组方案,换言之每一组选点方案恰对应于$2^{|E|-|V|+1}$个子图,答案即${|V|\choose k}2^{|E|-|V|+1}$
有多个连通块时,显然每一个连通块独立,用$f_{i,j}$表示前$i$个连通块中选$j$个点,枚举最后一个所选的点转移即可,复杂度为$o(n^{2})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 #define mod 998244353
5 int n,m,x,y,mi[N],fac[N],inv[N],f[N],szV[N],szE[N],dp[N][N];
6 int c(int n,int m){
7 return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
8 }
9 int find(int k){
10 if (k==f[k])return k;
11 return f[k]=find(f[k]);
12 }
13 void merge(int x,int y){
14 x=find(x),y=find(y);
15 if (x==y)szE[x]++;
16 else{
17 f[x]=y;
18 szV[y]+=szV[x];
19 szE[y]+=szE[x]+1;
20 }
21 }
22 int main(){
23 mi[0]=fac[0]=inv[0]=inv[1]=1;
24 for(int i=1;i<N;i++)mi[i]=2*mi[i-1]%mod;
25 for(int i=1;i<N;i++)fac[i]=1LL*fac[i-1]*i%mod;
26 for(int i=2;i<N;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
27 for(int i=1;i<N;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
28 scanf("%d%d",&n,&m);
29 for(int i=1;i<=n;i++){
30 f[i]=i;
31 szV[i]=1,szE[i]=0;
32 }
33 for(int i=1;i<=m;i++){
34 scanf("%d%d",&x,&y);
35 merge(x,y);
36 }
37 dp[0][0]=1;
38 int scc=0;
39 for(int i=1;i<=n;i++)
40 if (f[i]==i){
41 scc++;
42 for(int j=0;j<=n;j++)
43 for(int k=0;k<=min(j,szV[i]);k+=2)
44 dp[scc][j]=(dp[scc][j]+1LL*mi[szE[i]-szV[i]+1]*c(szV[i],k)%mod*dp[scc-1][j-k])%mod;
45 }
46 for(int i=0;i<=n;i++)printf("%d\n",dp[scc][i]);
47 }
[atARC115D]Odd Degree的更多相关文章
- cf#306D. Regular Bridge(图论,构图)
D. Regular Bridge time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- PAT1126:Eulerian Path
1126. Eulerian Path (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In grap ...
- A1126. Eulerian Path
In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similar ...
- PAT A1126 Eulerian Path (25 分)——连通图,入度
In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similar ...
- 1126 Eulerian Path (25 分)
1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...
- PAT甲级 1126. Eulerian Path (25)
1126. Eulerian Path (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In grap ...
- PAT 甲级 1126 Eulerian Path
https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152 In graph theory, an Eu ...
- 3.26-3.31【cf补题+其他】
计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...
- PAT 1126 Eulerian Path[欧拉路][比较]
1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...
随机推荐
- mysql-router-MIC-8.0.26集群部署
1.具体部署详情请看视频 https://space.bilibili.com/677825194 2.mysql主要配置如下 cat > /etc/my.cnf <<EOF [cl ...
- InstallSheild相关
一.关于使用InstallSheild制作安装包的总结. 1.定制化制作需要了解InstallScript语法,相关资料可以去网上查找,后续提供比较好的资料. 2.有些软件运行是需要一些环境的,譬如使 ...
- 2020.11.14-pta天梯练习赛补题
7-7 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca ...
- Windows用cmd编译运行C程序
在Windows环境下用命令行编译运行程序 浙江大学-C语言程序设计进阶 配置gcc 准备一个Dev-cpp 找到gcc.exe所在目录 Dev-Cpp\MinGW64\bin 地址栏右键将地址复制为 ...
- 小白自制Linux开发板 五. Debian文件系统制作,以及WIFI配置、交换分区配置
该片文章将完整记录一个Debian的最小文件系统的生成,以及自定义配置WIFI组件.网络组件和交换分区配置 本文章参考:https://whycan.com/t_4236.htmlhttp://www ...
- 力扣 - 剑指 Offer 45. 把数组排成最小的数
题目 剑指 Offer 45. 把数组排成最小的数 思路1 将整数数组转化成字符串数组 然后使用Arrays工具类的sort方法帮助我们排序 代码 class Solution { public St ...
- JDK 8中重要的函数式接口(必知必会)
JDK 8 提供的重要函数式接口: Consumer (消费者) 功能:接收一个对象,返回void. 定义:void accept(T t) 默认方法:Consumer andThen(Consume ...
- mysql all_ip_test局域网IP测试工具,有需要的改一改.
1 import threading 2 import subprocess 3 import pymysql 4 # threading.Lock() 5 6 7 class Link(object ...
- 5.27日Scrum Metting
日期:2021年5月27日 会议主要内容概述:确定账单数据格式,确定需要添加新的图表,确定模板分享功能任务量. 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 ...
- 调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer
调整数组顺序使奇数位于偶数前面 牛客网 剑指Offer 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇 ...