[BZOJ 2169]连边
Description
有N个点(编号1到N)组成的无向图,已经为你连了M条边。请你再连K条边,使得所有的点的度数都是偶数。求有多少种连的方法。要求你连的K条边中不能有重边,但和已经连好的边可以重。不允许自环的存在。求连边的方法数。我们只关心它模10007的余数。
Input
输入的第一行有三个自然数,分别表示点数N,已经连好的边数M,和你要连的边数K。保证K≤N(N-1)/2 接下来M行每行两个整数x,y,描述了一条连接x和y的边。 30%的数据满足: N≤200 100%的数据满足: N≤1000,M≤N,K≤1000,K≤N(N-1)/2
Output
输出一个整数,表示连边的方法数模10007的余数
Sample Input
1 2
Sample Output
HINT
【样例说明】
以下是13种连边的方法(只显示你连的边):
{(1,2),(1,3),(1,4),(3,4)}
{(1,2),(1,3),(1,5),(3,5)}
{(1,2),(1,4),(1,5),(4,5)}
{(1,2),(2,3),(2,4),(3,4)}
{(1,2),(2,3),(2,5),(3,5)}
{(1,2),(2,4),(2,5),(4,5)}
{(1,2),(3,4),(3,5),(4,5)}
{(1,3),(2,4),(3,5),(4,5)}
{(1,3),(2,5),(3,4),(4,5)}
{(1,4),(2,3),(3,5),(4,5)}
{(1,4),(2,5),(3,4),(3,5)}
{(1,5),(2,3),(3,4),(4,5)}
{(1,5),(2,4),(3,4),(3,5)}
题解
我们令$f[i][j]$表示有序地添入$i$条边后还剩$j$个奇点的方案数。
易推出
1.$f[i][j]+=f[i-1][j-2]*{C^2 _{n-j+2}}$ (第$i$条边连接了两个非奇点)
2.$f[i][j]+=f[i-1][j]*j*(n-j)$ (第$i$条边连接一个奇点一个非奇点)
3.$f[i][j]+=f[i-1][j+2]*{C^2 _{j+2}}$ (第$i$条边连接两个奇点)
但除此之外,我们还没有考虑不能连接相同的边。
由容斥原理得:
4.$f[i][j]-=f[i-2][j]*({C^2 _n}-(i-2))$ (总共${C^2 _n}$条边,我们已经排除$i-2$条一定不重复)。
这样$f[i][j]$的转移方程就列完了,然而,题目要求的并不是有序的我们还需要将$f[i][j]/=i$使$f$代表无序。
综上,若$f[i][j]$表示无序地添入$i$条边后还剩$j$个奇点的方案数:
$f[i][j] = {1 \over i}(f[i-1][j-2]*{C^2 _{n-j+2}}$$+f[i-1][j]*j*(n-j)$$+f[i-1][j+2]*{C^2 _{j+2}}$$-f[i-2][j]*({C^2 _n}-(i-2)))$
//It is made by Awson on 2017.9.23
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define LL long long
using namespace std;
const int N = ;
const int MOD = ; int n, m, k, u, v;
bool odd[N+];
int f[N+][N+]; int quick_pow(int a, int b) {
int c = ;
while (b) {
if (b&) c = a*c%MOD;
a = a*a%MOD;
b >>= ;
}
return c;
}
int C2(int n) {
return n*(n-)/%MOD;
} void work() {
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= m; i++) {
scanf("%d%d", &u, &v);
odd[u] = !odd[u];
odd[v] = !odd[v];
}
int cnt = ;
for (int i = ; i <= n; i++) cnt += odd[i];
f[][cnt] = ;
for (int i = ; i <= k; i++)
for (int j = ; j <= n; j++) {
if (j >= ) f[i][j] = (f[i][j]+f[i-][j-]*C2(n-j+)%MOD)%MOD;
f[i][j] = (f[i][j]+f[i-][j]*j%MOD*(n-j)%MOD)%MOD;
if (j+ <= n) f[i][j] = (f[i][j]+f[i-][j+]*C2(j+)%MOD)%MOD;
if (i >= ) f[i][j] = (f[i][j]+MOD-f[i-][j]*(C2(n)-(i-))%MOD)%MOD;
f[i][j] = f[i][j]*quick_pow(i, MOD-)%MOD;
}
printf("%d\n", f[k][]);
}
int main() {
work();
return ;
}
[BZOJ 2169]连边的更多相关文章
- bzoj 2169 连边——去重的思想
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2169 如果之前都去好重了,可以看作这次连的边只会和上一次连的边重复. 可以认为从上上次的状态 ...
- bzoj 2169 连边 —— DP+容斥
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2169 就和这篇博客说的一样:https://blog.csdn.net/WerKeyTom_ ...
- BZOJ 2169
$f_{ij}$ 表示加入 $i$ 条边, $j$ 个点的度数是奇数的方案数,然后暴力 #include<bits/stdc++.h> using namespace std; #defi ...
- BZOJ 2169 连边 DP
思路:DP 提交:\(1\)次(课上刚讲过) 题解: 如果不管重边的话,我们设\(f[i][j]\)表示连了\(i\)条边,\(j\)个点的度数是奇数的方案数,那么显然我们可以分三种状态转移: \(f ...
- [HNOI 2011]卡农
Description 题库链接 在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质: 所有选出的 \(m\) 个子集都不能为空. 所有选出的 \(m\) 个子集 ...
- 容斥原理+补集转化+MinMax容斥
容斥原理的思想大家都应该挺熟悉的,然后补集转化其实就是容斥原理的一种应用. 一篇讲容斥的博文https://www.cnblogs.com/gzy-cjoier/p/9686787.html 当我们遇 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
随机推荐
- 《高级软件测试》11.15.全组完成jira安装,开始任务的部分书写
今日任务完成情况如下: 小段:完成linux环境上jira的安装,并将jira的安装过程录制下来 小费:完成linux环境下jira的安装,开始部分任务的书写 小高:完成了jira的安装,并进一步熟悉 ...
- bzoj千题计划276:bzoj4515: [Sdoi2016]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当 ...
- react中的DOM操作
前面的话 某些情况下需要在典型数据流外强制修改子代.要修改的子代可以是 React 组件实例,也可以是 DOM 元素.这时就要用到refs来操作DOM 使用场景 下面是几个适合使用 refs 的情况 ...
- github提交代码到服务器的方法
第一种情况,没有冲突:1.git add .//进入到center的项目下将本地文件打包的意思2.git pull origin dev//将服务器的代码下载到本地如果是最新的会提示Already u ...
- C# 使用 GDI+ 给图片添加文字,并使文字自适应矩形区域
需求 需求是要做一个编辑文字的页面.用户在网页端写文字,文字区域是个矩形框,用户可以通过下方的拖动条调节文字大小. 如下图: 提交数据的时候前端传文字区域的左上角和右下角定位给后台.因为前端的字体大小 ...
- Linq 大合集
static void Main(string[] args) { string[] words = { "zero", "one", "two&qu ...
- 自动化服务部署(二):Linux下安装jenkins
jenkins是一个Java开发的开源持续集成工具,广泛用于项目开发,具有自动化构建.测试和部署等功能,它的运行需要Java环境. 上篇博客介绍了Linux下安装JDK的步骤,这篇博客,介绍下Linu ...
- SpringBoot应用的监控与管理
spring-boot-starter-actuator模块 /health /autoconfig /beans /configprops:应用配置属性信息 /env:环境属性,如:环境变量.jvm ...
- gradle入门(1-1)gradle的概念和使用
一.Gradle是什么 Gradle是一种Java应用构建工具,它采用领域特定语言 Groovy 语法实现配置. 1.Gradle的基本概念 项目:项目的配置 即 build.gradle. 任务:任 ...
- 200行Py代码带你实现"打飞机"
前言 多年前,你我在一起"打飞机".为了实现真正的打飞机,在下一年前踏足帝都学习了无所不能的Python,辣么接下来带你在俩个小时用200行代码学会打飞机. python中提供了一 ...