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

5 1 4
1 2

Sample Output

13

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]连边的更多相关文章

  1. bzoj 2169 连边——去重的思想

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2169 如果之前都去好重了,可以看作这次连的边只会和上一次连的边重复. 可以认为从上上次的状态 ...

  2. bzoj 2169 连边 —— DP+容斥

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2169 就和这篇博客说的一样:https://blog.csdn.net/WerKeyTom_ ...

  3. BZOJ 2169

    $f_{ij}$ 表示加入 $i$ 条边, $j$ 个点的度数是奇数的方案数,然后暴力 #include<bits/stdc++.h> using namespace std; #defi ...

  4. BZOJ 2169 连边 DP

    思路:DP 提交:\(1\)次(课上刚讲过) 题解: 如果不管重边的话,我们设\(f[i][j]\)表示连了\(i\)条边,\(j\)个点的度数是奇数的方案数,那么显然我们可以分三种状态转移: \(f ...

  5. [HNOI 2011]卡农

    Description 题库链接 在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质: 所有选出的 \(m\) 个子集都不能为空. 所有选出的 \(m\) 个子集 ...

  6. 容斥原理+补集转化+MinMax容斥

    容斥原理的思想大家都应该挺熟悉的,然后补集转化其实就是容斥原理的一种应用. 一篇讲容斥的博文https://www.cnblogs.com/gzy-cjoier/p/9686787.html 当我们遇 ...

  7. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  8. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  9. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

随机推荐

  1. 实验三《Java面向对象程序设计》实验报告

    20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...

  2. 20145237 《Java程序设计》第2周学习总结

    教材学习内容总结 本周我学习了java的基础语法.分为类型.变量与运算符,流程控制. 一.类型:1.Java可以区分为基本类型和类类型.类类型也称作参考类型.2.Java中基本类型主要是整数.字节.浮 ...

  3. socket_sever实现多客户端并发

    #!/usr/bin/env python # -*- coding:utf-8 -*- import socketserver class mysever(socketserver.BaseRequ ...

  4. 利用yield 实现Xrange功能

    def xrange(n): start = 0 while True: if start>n: return yield start start+=1 obj = xrange(5) n1 = ...

  5. Android属性动画 nineoldandroids

    各种资源链接 nineoldandroids 任玉刚的五个图片滑动,点击menu http://blog.csdn.net/singwhatiwanna/article/details/1763998 ...

  6. hibernate懒加载导致jackjson解析json时StackOverFlow

    @JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...

  7. 从一次输入框无法输入的bug,谈如何限制输入框输入类型

    bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...

  8. Mybatis-select-返回值类型错误理解

    Mybatis :Cause: java.lang.UnsupportedOperationException异常: 今天在写一个练手项目,作为初学Mybatis的小白,想着这里findByEmp_i ...

  9. 解决忽略VScode中Python插件pylint报错的问题

    pylint是VScode中python自带的插件,可以帮助代码规范,美观. 但是有些报错是你不想看到的,你可以选择性的忽略. 例如,在re.compile()中,可以添加参数re.S使. 匹配任意字 ...

  10. Web Api 过滤器之 ExceptionFilter 异常过滤器

    一.服务器出现异常,会统一向客户端返回 500 的错误. [RoutePrefix("api/test")] public class TestController : ApiCo ...