uva 1436 - Counting heaps(算)
2024-08-23 05:31:55
题目链接: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;
}
最新文章
- 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)
- sklearn学习笔记1
- Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx
- paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
- MVC模式的学生信息增删改查
- 在Linux下JDK1.4.2安装报错的解决方法
- hdu 4324 Triangle LOVE
- Oracle 学习笔记(三)
- c 递归函数浅析
- Android之Http网络编程(二)
- Mounting File Systems
- 如何诊断crs 安装时 root.sh 脚本执行错误
- Windows Phone 如果你把Pivot控件当成主页面,那么这篇文章你值得看。
- 例10-6 uva1635(唯一分解定理)
- Swift的基础之关于“!”和“?”的使用介绍
- Url校验正则
- python - 计算器 程序练习
- 简单好用的计算器:bc
- 转:WEB前端性能优化规则
- SQL2005的SSMS连接SQL2012会有问题
热门文章
- php 百度地图 腾讯地图 转换坐标
- JAVA中try-catch异常逃逸
- 微擎 plugin 时间插件 图片上传插件不显示 报错 影响下面执行
- 下载的pod链接失效,build diff: /../Podfile.lock: No such file or directory解决办法
- 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
- Spring MVC出现POST 400 Bad Request &;405 Request method &#39;GET&#39; not supported
- BZOJ1297 迷路 - 矩阵的幂
- 利用SendMessage实现窗口拖动
- Scala入门到精通——第二十七节 Scala操纵XML
- CentOS7查看开放端口命令