UVa Online Judge

  训练指南的题目。

  题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面。问一共有多少种方式。

  做法是,对于每一个父节点,将它的儿子结点构成的子树看成无序状态,这样子对当前父节点整棵树计算一个排列数。如果把所有的这样的式子写出来,可以发现分子分母是可以相消的。假设点的总数是S,儿子的点的数目分别是A,B,C...,这样的话,对于这个结点,可以求得F(S)=F(A)+F(B)+F(C)+...。最后的结果是所有子树的F(S)*F(A)*F(B)*F(C)*...。最后消去以后就只剩下F(S)/(c(A)*c(B)*c(C)*...),其中c(X)是结点X的子树的结点个数。

代码如下:

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector> using namespace std; const int N = ;
map<int, int> id;
int lsf[N], pn, prm[N >> ]; void getprm() {
id.clear();
lsf[] = lsf[] = ;
pn = ;
for (int i = ; i < N; i++) {
if (!lsf[i]) {
id[i] = pn;
prm[pn++] = i;
for (int j = i; j < N; j += i) lsf[j] = i;
}
}
} typedef long long LL;
const LL MOD = ;
int cnt[N], fcn[N];
bool vis[N], fa[N];
vector<int> rel[N]; LL multi(int a, int b) {
LL ret = , p = a;
while (b > ) {
if (b & ) ret *= p, ret %= MOD;
p *= p, p %= MOD;
b >>= ;
}
return ret;
} void dfs(int x) {
cnt[x] = ;
for (vector<int>::iterator vi = rel[x].begin(); vi != rel[x].end(); vi++) {
dfs(*vi);
cnt[x] += cnt[*vi];
}
} int main() {
getprm();
int n, m, T;
scanf("%d", &T);
while (T-- && ~scanf("%d%d", &n, &m)) {
memset(vis, , sizeof(vis));
memset(cnt, , sizeof(cnt));
memset(fcn, , sizeof(fcn));
memset(fa, , sizeof(fa));
int x, y;
for (int i = ; i <= n; i++) rel[i].clear();
while (m--) {
scanf("%d%d", &x, &y);
rel[y].push_back(x);
fa[x] = true;
}
for (int i = ; i <= n; i++) if (!fa[i]) rel[].push_back(i);
dfs();
for (int i = ; i <= n; i++) {
int t = i;
while (t > ) {
fcn[id[lsf[t]]]++;
t /= lsf[t];
}
t = cnt[i];
while (t > ) {
fcn[id[lsf[t]]]--;
t /= lsf[t];
}
//cout << "~~ " << i << ' ' << cnt[i] << endl;
//for (int i = 0; i < 10; i++) cout << prm[i] << ' ' << fcn[i] << endl;
}
//cout << pn << endl;
LL ans = ;
for (int i = ; i < pn; i++) {
ans *= multi(prm[i], fcn[i]);
ans %= MOD;
}
cout << ans << endl;
}
return ;
}

——written by Lyon  

uva 11174 Stand in a Line (排列组合)的更多相关文章

  1. uva 11174 Stand in a Line

    // uva 11174 Stand in a Line // // 题目大意: // // 村子有n个村民,有多少种方法,使村民排成一条线 // 使得没有人站在他父亲的前面. // // 解题思路: ...

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

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

  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,UVA 1436 Counting heaps —— (组合数的好题)

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

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

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

  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 12712 && UVaLive 6653 Pattern Locker (排列组合)

    题意:给定 一个n * n 的宫格,就是图案解锁,然后问你在区间 [l, r] 内的所有的个数进行组合,有多少种. 析:本来以为是数位DP,后来仔细一想是排列组合,因为怎么组合都行,不用考虑实际要考虑 ...

  9. UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力

    题目说每个相同文件(01串)都被撕裂成两部分,要求拼凑成原来的样子,如果有多种可能输出一种. 我标题写着排列组合,其实不是什么高深的数学题,只要把最长的那几个和最短的那几个凑一起,然后去用其他几个验证 ...

随机推荐

  1. 从默认的index.jsp页面跳转或转发到其他页面

    使用forward还是redirect都可以完成跳转 forward:浏览器地址不变,所以存在重复提交的问题 <%  pageContext.forward("student/list ...

  2. homebrew长时间停在Updating Homebrew 这个步骤

    在国内的网络环境下使用 Homebrew 安装软件的过程中可能会长时间卡在 Updating Homebrew 这个步骤. 例:执行 brew install composer 命令 ➜ ~ brew ...

  3. 字符串的trim()用法

      trim() 方法会从一个字符串的两端删除空白字符.在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR). ...

  4. Postgresql 正则表达式【转】

    原文:http://blog.csdn.net/wugewuge/article/details/7704996 postgresql支持POSIX 风格的正则表达式,在postgresql中使用正则 ...

  5. linux小介绍

    常用命令

  6. SAS-一些有用的语句

    SAS-一些有用的语句 今天本想继续介绍 summary过程的,但是发现别人整理的比我更好,于是周末再更,好好整理一下描述性统计分析及评分卡建模,今天给大家介绍一些sas有用的语句吧. 1.如果在同一 ...

  7. orm1.0

    class Field: def __init__(self,name,column_type,primary_key,defaule): self.name = name self.column_t ...

  8. Objectarx之分批存储相连实体

    void CCommonFuntion::BatchStorageEnt(AcDbObjectIdArray& inputId, std::vector<std::vector<A ...

  9. 闲鱼Flutter&FaaS云端一体化架构

    讲师介绍 国有,闲鱼架构团队负责人.在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享. 传统Native+Web ...

  10. springboot 启动配置原理【转】【补】

    创建应用 几个重要的事件回调机制  , 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunL ...