题目链接: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(算)的更多相关文章

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

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

  2. UVA 12075 - Counting Triangles(容斥原理计数)

    题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...

  3. UVA 10198 Counting

    Counting The Problem Gustavo knows how to count, but he is now learning how write numbers. As he is ...

  4. UVA - 10574 Counting Rectangles

    Description Problem H Counting Rectangles Input: Standard Input Output:Standard Output Time Limit: 3 ...

  5. UVA 10574 - Counting Rectangles(枚举+计数)

    10574 - Counting Rectangles 题目链接 题意:给定一些点,求可以成几个边平行于坐标轴的矩形 思路:先把点按x排序,再按y排序.然后用O(n^2)的方法找出每条垂直x轴的边,保 ...

  6. UVA 10574 - Counting Rectangles 计数

    Given n points on the XY plane, count how many regular rectangles are formed. A rectangle is regular ...

  7. UVA 12075 Counting Triangles

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)

    先看第一题,有n*m个点,求在这些点中,有多少条直线,经过了至少两点,且不是水平的也不是竖直的. 分析:由于对称性,我们只要求一个方向的线即可.该题分成两个过程,第一个过程是求出n*m的矩形中,dp[ ...

  9. R1(下)—数据挖掘—关联规则理论介绍与R实现

    Apriori algorithm是关联规则里一项基本算法.是由Rakesh Agrawal和Ramakrishnan Srikant两位博士在1994年提出的关联规则挖掘算法.关联规则的目的就是在一 ...

随机推荐

  1. 使用ionic3快速开发webapp(一)

    Ionic可以让我们使用web技术快速构建接近原生体验的跨平台移动应用. 一.安装ionic 1.需要先安装 Node.js(版本8.x之上): 2.安装cordova 和 ionic: $ npm ...

  2. 远离“精神乞丐”(IBM的前CEO郭士纳把员工分为四种类型)

    语音丨吴伯凡 乞丐与其说是一种身份, 不如说是一种精神状态, 习惯性索取且心安理得, 习惯性寻求安慰,习惯性抱怨, 与之截然对立的, 是“操之在我”(Proactive)的精神, 乞丐型员工是公司内部 ...

  3. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  4. C#+HtmlAgilityPack

    C#+HtmlAgilityPack—糗事百科桌面版V2.0   最近在浏览以前自己上传的源码,发现在糗事百科桌面端源码评论区中,有人说现在程序不能用了.查看了一下源码运行情况,发现是正则表达式解析问 ...

  5. 安装innotop

    安装方法一: 下载地址:https://github.com/innotop/innotop yum install -y perl-TermReadKey yum install -y perl-D ...

  6. Ajax的get、post和ajax提交

    JQuery.get(url,[data],[callback],[type]) []里面的参数是可选的,不是必填的. [data]:带发送的key/value数据. [callback]:载入成功时 ...

  7. 前端调用百度API

    <!DOCTYPE html> <html> <head>         <meta charset="UTF-8">       ...

  8. array=nil 和 Array=[[NSMutableArray alloc]init]; 的区别

    情况1: array=nil; [_PayArray addObject:BillDetail]; 此时array还是nil:因为array没有分配地址应该. 情况2: Array=[[NSMutab ...

  9. erlang浅谈

    优点: 1.面向并发,有成熟而且久经考验的框架可供使用,网络部分已经经过了良好封装 2.内存缓存解决方案进程字典,前者的读写速度是50NS-100Ns级别的 3.对二进制数据解析的语法是直观,简单,强 ...

  10. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...