题目链接: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;
}

最新文章

  1. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)
  2. sklearn学习笔记1
  3. Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx
  4. paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
  5. MVC模式的学生信息增删改查
  6. 在Linux下JDK1.4.2安装报错的解决方法
  7. hdu 4324 Triangle LOVE
  8. Oracle 学习笔记(三)
  9. c 递归函数浅析
  10. Android之Http网络编程(二)
  11. Mounting File Systems
  12. 如何诊断crs 安装时 root.sh 脚本执行错误
  13. Windows Phone 如果你把Pivot控件当成主页面,那么这篇文章你值得看。
  14. 例10-6 uva1635(唯一分解定理)
  15. Swift的基础之关于“!”和“?”的使用介绍
  16. Url校验正则
  17. python - 计算器 程序练习
  18. 简单好用的计算器:bc
  19. 转:WEB前端性能优化规则
  20. SQL2005的SSMS连接SQL2012会有问题

热门文章

  1. php 百度地图 腾讯地图 转换坐标
  2. JAVA中try-catch异常逃逸
  3. 微擎 plugin 时间插件 图片上传插件不显示 报错 影响下面执行
  4. 下载的pod链接失效,build diff: /../Podfile.lock: No such file or directory解决办法
  5. System.ArgumentException: 已添加了具有相同键的项。(An item with the same key has already been added) 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 在 System.Web.Mvc.Js
  6. Spring MVC出现POST 400 Bad Request &amp;405 Request method &#39;GET&#39; not supported
  7. BZOJ1297 迷路 - 矩阵的幂
  8. 利用SendMessage实现窗口拖动
  9. Scala入门到精通——第二十七节 Scala操纵XML
  10. CentOS7查看开放端口命令