题目链接:uva 1436 - Counting heaps
题目大意:给出一个树的形状,如今为这棵树标号,保证根节点的标号值比子节点的标号值大,问有多少种标号树。
解题思路:和村名排队的思路是一仅仅的uva11174,最后问题仅仅和树德结构有直接关系。f(root)=(s(root)−1)!(s(1)∗s(2)∗⋯∗s(n)
可是给定的取模数不是质数。所以不能用逆元做。仅仅能将分子分母分别拆分成质因子,然后对质因子进制约分。由于最后的答案一定是正整数,所以对于每一个质因子,分子分解出的因子个数一定大于等于分母分解出的。最后约分肯定剩下的是分子,再用高速幂求解。
剪枝。由于分解质因子的次数许多。所以须要对分解函数剪枝。当u是质数时,能够直接终止返回。
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N = 500005;
typedef long long ll;
int P = 0, prime[N], ispri[N];
int n, f[N], vis[N], cnt[N];
ll mod;
void getPrime (int N) {
memset(ispri, 0, sizeof(ispri));
for (int i = 2; i < N; i++) {
if (ispri[i])
continue;
prime[P++] = i;
for (int j = 2 * i; j < N; j += i)
ispri[j] = 1;
}
}
void getNode () {
memset(cnt, 0, sizeof(cnt));
queue<int> que;
for (int i = 1; i <= n; i++)
if (vis[i] == 0)
que.push(i);
while (!que.empty()) {
int u = que.front();
que.pop();
cnt[u]++;
int v = f[u];
cnt[v] += cnt[u];
vis[v]--;
if (vis[v] == 0)
que.push(v);
}
}
void init () {
memset(vis, 0, sizeof(vis));
scanf("%d%lld", &n, &mod);
f[1] = 0;
for (int i = 2; i <= n; i++) {
scanf("%d", &f[i]);
vis[f[i]]++;
}
getNode();
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
vis[cnt[i]]++;
}
ll power (ll x, ll m) {
ll ans = 1;
while (m) {
if (m&1)
ans = ans * x % mod;
x = x * x % mod;
m /= 2;
}
return ans;
}
void cal (int u, int v) {
for (int i = 0; i < P; i++) {
int k = prime[i];
while (u % k == 0) {
cnt[k] += v;
u /= k;
}
if (ispri[u] == 0) {
cnt[u] += v;
return;
}
}
}
ll solve () {
memset(cnt, 0, sizeof(cnt));
for (int i = 2; i <= n; i++)
cal(i, 1);
for (int i = 2; i <= n; i++)
if (vis[i])
cal(i, -vis[i]);
ll ans = 1;
for (int i = 0; i < P; i++) {
ll u = prime[i];
if (cnt[u])
ans = (ans * power(u, cnt[u])) % mod;
}
return ans;
}
int main () {
getPrime(N);
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%lld\n", solve());
}
return 0;
}
uva 1436 - Counting heaps(算)的更多相关文章
-
UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)
这两个题的模型是有n个人,有若干的关系表示谁是谁的父亲,让他们进行排队,且父亲必须排在儿子前面(不一定相邻).求排列数. 我们假设s[i]是i这个节点,他们一家子的总个数(或者换句话说,等于他的子孙数 ...
-
UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...
-
UVA 10198 Counting
Counting The Problem Gustavo knows how to count, but he is now learning how write numbers. As he is ...
-
UVA - 10574 Counting Rectangles
Description Problem H Counting Rectangles Input: Standard Input Output:Standard Output Time Limit: 3 ...
-
UVA 10574 - Counting Rectangles(枚举+计数)
10574 - Counting Rectangles 题目链接 题意:给定一些点,求可以成几个边平行于坐标轴的矩形 思路:先把点按x排序,再按y排序.然后用O(n^2)的方法找出每条垂直x轴的边,保 ...
-
UVA 10574 - Counting Rectangles 计数
Given n points on the XY plane, count how many regular rectangles are formed. A rectangle is regular ...
-
UVA 12075 Counting Triangles
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
-
UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)
先看第一题,有n*m个点,求在这些点中,有多少条直线,经过了至少两点,且不是水平的也不是竖直的. 分析:由于对称性,我们只要求一个方向的线即可.该题分成两个过程,第一个过程是求出n*m的矩形中,dp[ ...
-
R1(下)—数据挖掘—关联规则理论介绍与R实现
Apriori algorithm是关联规则里一项基本算法.是由Rakesh Agrawal和Ramakrishnan Srikant两位博士在1994年提出的关联规则挖掘算法.关联规则的目的就是在一 ...
随机推荐
-
传递引用类型参数的两种方式(转自 MSDN)
引用类型的变量不直接包含其数据:它包含的是对其数据的引用.当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值(更改属性的值),但是无法更改引用本身的值:也就是说,不能使用相同的引 ...
-
SharedPreferences的基本数据写入和读取
1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
-
嵌入式 详解udev
如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...
-
Servlet &; JSP - 中文字符问题
Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumer ...
-
Dijango学习_01_pycharm创建应用
一.当初在学dijango的时候,网上的教程非常的杂且多,对于؏؏☝ᖗ乛◡乛ᖘ☝؏؏我们这种初入虎门的小白来说有太多误区 (其实是大佬的操作着实对小白不太友好,原谅我个萌新..2333..) 二.pi ...
-
RocketMQ生产消费模型选择
一. 生产者,根据某个标识将消息放到同一个队列中 在发送消息时,使用SelectMessageQueueByHash,该类根据传入进去的arg,进行hash计算,将消息分配到相应的队列中. publi ...
-
ubuntu 16.04 安装 ssh
只要一条命令: sudo apt-get install openssh-server
-
JDK和Tomcat安装
JDK安装: 1,选择安装位置,其余默认安装,安装两次,一个是JDK,一个是JRE,安装在两个文件夹中. 2,配置环境变量: 1,新建一个变量,变量名:JAVA_HOME,变量值:C:\Program ...
-
curl 超时设置<;转>;
PHP cURL 的超时设置有两个 CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT,他们的区别是: CURLOPT_CONNECTTIMEOUT 用来告诉 PHP 在 ...
-
Ajax:HyperText/URI, HTML, Javascript, frame, frameset, DHTML/DOM, iframe, XMLHttp, XMLHttpRequest
本文内容 Ajax 诞生 促使 Ajax 产生的 Web 技术演化 真正 Ajax Ajax 与 Web 2.0 Ajax 背后的技术 2008 年毕业,2011 年看了<Ajax 高级程序设计 ...