//    uva 11174 Stand in a Line
//
// 题目大意:
//
// 村子有n个村民,有多少种方法,使村民排成一条线
// 使得没有人站在他父亲的前面.
//
// 解题思路:
//
// 换成模型,先将森林变成一棵树,这样就直观多了,对于
// 一个节点,他的子节点排列时没有任何要求,而子排列中会有
// 限制,将这些限制先提取出来,就可以将所有的视为相同的了,
// 然后就是有重复元素的全排列问题.设s(i)为以i节点为根的子树
// f(i)为以i为根的子树的排法,
// f(i) = f(c1)f(c2)...(s(i)-1)! / (s(c1)!s(c2)!...s(ck)!);
// cj为i的第j个儿子.递归发现所有的非根节点的f带入上式,发现所有的
// 非根节点u都会以(s(u)-1)!出现在以他为根的分子中,s(u)出现在他父
// 节点的分母中,约分之后,分子为1,分母为s(u),这样就得到了一个
// 简化的式子,:
// f(root) = (s(root)-1)!/(s(c1)s(c2)...s(ck));
// s(root) = n + 1;
// 最后的结果为n!除以所有的s(i). #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector> using namespace std; const int MAX_N = ; typedef long long ll; vector<int> g[MAX_N]; const ll MOD = 1e9 + ; int cnt[MAX_N];
bool vis[MAX_N];
int n,m; void dfs(int u){
vis[u] = ;
cnt[u]=;
for (int i=;i<g[u].size();i++){
int v = g[u][i];
if (vis[v])
continue; dfs(v); cnt[u] += cnt[v];
}
} void exgcd(ll a,ll b,ll &x,ll &y){
if (b==){
x = ;
y = ;
return ;
}
exgcd(b,a%b,x,y);
ll temp = x;
x = y;
y = temp - a / b * y;
} void print(){
for (int i=;i<=n;i++){
printf("%d ",cnt[i]);
}
cout << endl;
} void input(){
scanf("%d%d",&n,&m);
ll ans = ;
memset(cnt,,sizeof(cnt));
memset(vis,,sizeof(vis));
for (int i=;i<=n;i++){
ans = ans * i % MOD;
g[i].clear();
}
int u,v;
for (int i=;i<=m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
} for (int i=;i<=n;i++){
if (!vis[i])
dfs(i);
}
// print();
ll p = ; for (int i=;i<=n;i++){
p = p * cnt[i] % MOD;
} //printf("cnt = %lld\n",p); ll x,y; exgcd(MOD,p,x,y); cout << ans * ((y + MOD )%MOD) % MOD << endl; } int main(){
int t;
// freopen("1.txt","r",stdin);
scanf("%d",&t);
while(t--){
input();
}
}

uva 11174 Stand in a Line的更多相关文章

  1. UVA 11174 Stand in a Line 树上计数

    UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘   即是答案 当然由于有MOD 要求逆. #include & ...

  2. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...

  3. UVA 11174 Stand in a Line (组合+除法的求模)

    题意:村子里有n个人,给出父亲和儿子的关系,有多少种方式可以把他们排成一列,使得没人会排在他父亲的前面 思路:设f[i]表示以i为根的子树有f[i]种排法,节点i的各个子树的根节点,即它的儿子为c1, ...

  4. UVA 11174 Stand in a Line 树dp+算

    主题链接:点击打开链接 题意:白书的P103. 加个虚根就能够了...然后就是一个多重集排列. import java.io.PrintWriter; import java.util.ArrayLi ...

  5. 【递推】【推导】【乘法逆元】UVA - 11174 - Stand in a Line

    http://blog.csdn.net/u011915301/article/details/43883039 依旧是<训练指南>上的一道例题.书上讲的比较抽象,下面就把解法具体一下.因 ...

  6. UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)

    这两个题的模型是有n个人,有若干的关系表示谁是谁的父亲,让他们进行排队,且父亲必须排在儿子前面(不一定相邻).求排列数. 我们假设s[i]是i这个节点,他们一家子的总个数(或者换句话说,等于他的子孙数 ...

  7. 数学:UVAoj 11174 Stand in a Line

    Problem J Stand in a Line Input: Standard Input Output: Standard Output All the people in the bytela ...

  8. UVa 11174 (乘法逆元) Stand in a Line

    题意: 有n个人排队,要求每个人不能排在自己父亲的前面(如果有的话),求所有的排队方案数模1e9+7的值. 分析: <训练指南>上分析得挺清楚的,把公式贴一下吧: 设f(i)为以i为根节点 ...

  9. UVa 12657 Boxes in a Line(应用双链表)

    Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...

随机推荐

  1. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework概述

    Spring Framework是什么? it is a potential one-stop-shop for building your enterprise-ready applications ...

  2. 破解excel密码保护

    破解excel密码保护 录制一个新宏.内容如下.保存后运行,点几次确定,过一分钟还会再弹出来,再点确定,然后就好了. Public Sub AllInternalPasswords() ' Break ...

  3. ffmpeg 音频转换: use ffmpeg convert the audio from stereo to mono without changing the video part

    To convert the audio from stereo to mono without changing the video part, you can use FFmpeg: ffmpeg ...

  4. eclipse黑色主题

    Lennon http://www.cnblogs.com/csulennon/p/4231405.html

  5. MSSql Server 索引'uq_f_userName' 依赖于 列'f_userName'。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN f_userName 失败

    --需求有变,需要往t_login表的f_userName字段添加外国人名,之前设置的varchar(10)不够,商议决定改成varchar(30),执行的时候,提示消息 索引'uq_f_userNa ...

  6. JS之函数表达式

    度过一个愉快短暂的周末,又可以开始学习了!我爱学习,学习使人进步.今天学习函数表达式,着重学习下闭包函数. 函数表达式 可以在定义的函数声明之前调用它,但是不能在定义函数表达式之前调用它 /** * ...

  7. Python模块:PIL

    PIL:是Python Image Library的缩写,图像处理的模块.Image,ImageFont,ImageDraw,ImageFilter Image模块: 常用方法: open() #打开 ...

  8. SikuliLibrary 库关键字注释

    在  https://github.com/rainmanwy/robotframework-SikuliLibrary 看到rainmanwy 整理的SikuliLibrary库,非常适合工作需要, ...

  9. JS 传值 传址

    在JS中,有两种不同的方式可以操作数据的值,这两种技术分别叫做 传值 和 传址. 传值:在赋值过程中,首先对值进行了一份拷贝,而后将这份拷贝存储到一个变量.对象属性或数组元素中.拷贝的值和原始的值是完 ...

  10. sprintf()函数,把数字转换成字符串

    char str_2[10];     int a=1234321;     sprintf(str_2,"%d",a);