uva 11174 Stand in a Line (排列组合)
训练指南的题目。
题意是,给出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 (排列组合)的更多相关文章
- uva 11174 Stand in a Line
// uva 11174 Stand in a Line // // 题目大意: // // 村子有n个村民,有多少种方法,使村民排成一条线 // 使得没有人站在他父亲的前面. // // 解题思路: ...
- UVA 11174 Stand in a Line 树上计数
UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘 即是答案 当然由于有MOD 要求逆. #include & ...
- UVA 11174 Stand in a Line (组合+除法的求模)
题意:村子里有n个人,给出父亲和儿子的关系,有多少种方式可以把他们排成一列,使得没人会排在他父亲的前面 思路:设f[i]表示以i为根的子树有f[i]种排法,节点i的各个子树的根节点,即它的儿子为c1, ...
- UVA 11174 Stand in a Line 树dp+算
主题链接:点击打开链接 题意:白书的P103. 加个虚根就能够了...然后就是一个多重集排列. import java.io.PrintWriter; import java.util.ArrayLi ...
- UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)
这两个题的模型是有n个人,有若干的关系表示谁是谁的父亲,让他们进行排队,且父亲必须排在儿子前面(不一定相邻).求排列数. 我们假设s[i]是i这个节点,他们一家子的总个数(或者换句话说,等于他的子孙数 ...
- 【递推】【推导】【乘法逆元】UVA - 11174 - Stand in a Line
http://blog.csdn.net/u011915301/article/details/43883039 依旧是<训练指南>上的一道例题.书上讲的比较抽象,下面就把解法具体一下.因 ...
- 数学:UVAoj 11174 Stand in a Line
Problem J Stand in a Line Input: Standard Input Output: Standard Output All the people in the bytela ...
- UVa 12712 && UVaLive 6653 Pattern Locker (排列组合)
题意:给定 一个n * n 的宫格,就是图案解锁,然后问你在区间 [l, r] 内的所有的个数进行组合,有多少种. 析:本来以为是数位DP,后来仔细一想是排列组合,因为怎么组合都行,不用考虑实际要考虑 ...
- UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力
题目说每个相同文件(01串)都被撕裂成两部分,要求拼凑成原来的样子,如果有多种可能输出一种. 我标题写着排列组合,其实不是什么高深的数学题,只要把最长的那几个和最短的那几个凑一起,然后去用其他几个验证 ...
随机推荐
- 在Vmware安装虚拟机WindowsServer 2003
一.创建并安装虚拟机 新建Windows2003server系统 按照下面操作即可 https://www.cnblogs.com/color-blue/p/8525710.html 二.安装虚拟机 ...
- Apache-Shiro分布式环境配置(与redis集成)(转)
原文戳我 前段时间项目要用到权限控制的相关模块,经过讨论决定采用Apache下面的Shiro开源框架进行身份校验与权限控制,因项目需部署在集群环境下,所以需要分布式的支持,故配置了Redis作为权限数 ...
- 学习JDK1.8集合源码之--WeakHashMap
1. WeakHashMap简介 WeakHashMap继承自AbstractMap,实现了Map接口. 和HashMap一样,WeakHashMap也是一种以key-value键值对的形式进行数据的 ...
- 如何用git将项目代码上传到github - CSDN博客
配置Git 我们先在电脑硬盘里找一块地方存放本地仓库,比如我们把本地仓库建立在C:\MyRepository\1ke_test文件夹下 进入1ke_test文件夹 鼠标右键操作如下步骤: 1)在本地仓 ...
- sqlyog备份数据和导入备份数据
使用sqlyog备份数据 Database -> Backup/Export -> Backup Database As SQL Dump 根据自己实际情况,看需要 导出表结构或者仅仅只 ...
- Liferay 7:如何在Liferay Portlet中使用Angular, React, Vue.js等前端框架
https://web.liferay.com/zh/web/ivan.zaera/blog/-/blogs/modern-frontend-workflows-in-liferay-portal L ...
- 实践中了解到的CSS样式的优先级
CSS三大特性——继承.优先级和层叠.这是在精通CSS中重点强调的内容. 继承即子类元素继承父类的样式,常用的可继承样式有:color,font,line-height,list-style,text ...
- Hibernate:**not found while looking for property: id https://blog.csdn.net/weixin_43827144/article/details/88935334
https://blog.csdn.net/weixin_43827144/article/details/88935334 在程序执行时可能会报找不到属性的错误:例如:class Student n ...
- 公司mysql问题三
数据库连接不上,解决方案: # 加在绿框?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
- Direct2D 第1篇 最简单的D2D程序
原文:Direct2D 第1篇 最简单的D2D程序 编译之前,得先安装DirectX SDK #include <windows.h> #include <d2d1.h> #i ...