codevs1304 拓扑序计数
题目描述 Description
求一颗有根树/树形图的拓扑序个数.
第一行一个n和一个素数P,表示这颗树有n个节点,要求拓扑序个数modP之后的结果.
接下来n-1行,每行有两个数字x和y,表示x是y的父亲.
保证1<=n<=1500000, n<P<2^31,P为质数.
一行一个数字,为该树形图拓扑序个数modP的结果.
样例1 4 100000007 1 2 1 3 2 4
样例2 6 100000007 1 2 2 3 1 4 3 5 5 6
样例1 3
样例2 5
每个非根节点的儿子个数平均较多,数据量较大,建议c/c++选手才用scanf的读入方式
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; int md; long long gcd(long long y3)
{
long long x1 = ,x2 = ,y1 = ,y2 = ,x3 = md,t1,t2,t3,q;
while()
{
if (y3==) return y2;
q=x3/y3;
t1=x1-q*y1,t2=x2-q*y2,t3=x3-q*y3;
x1 = y1,x2 = y2,x3 = y3;
y1 = t1,y2 = t2,y3 = t3;
}
} long long an[];
//long long bn[1510000];
long long n;
struct edge
{
int v,next;
}edge[];
int head[],e = ;
void increase(int u,int v)
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}
int cn[];
long long ans[];
bool rd[]; void dfs(int k)
{
cn[k] = ans[k] = ;
for(int t = head[k];t!=;t = edge[t].next)
{
int v = edge[t].v;
if(!cn[v]) dfs(v);
cn[k]+=cn[v];
ans[k] = ans[k]*(gcd(an[cn[v]])+md)%md*ans[v]%md;
}
ans[k] = ans[k]*an[cn[k]-]%md;
}
int Scan()
{
char ch;
int a = ;
while((ch = getchar())>=)
{
a = *a+ch-;
}
return a;
} int main()
{
n = Scan(),md = Scan();
long long i,j,k;
//an[0] = bn[0] = 1;
an[] = ;
for(i = ;i<=n;i++)
{
an[i] = an[i-]*i%md;
//bn[i] = bn[i-1]*(gcd(i)+md)%md;
}
for(i = ;i<n;i++)
{
int a,b;
a = Scan(),b = Scan();
rd[b]|=;
increase(a,b);
}
int fa;
for(i = ;i<=n;i++)
if(!rd[i])
{
fa = i;
break;
}
dfs(fa);
cout<<ans[fa]<<endl;
return ;
}
codevs1304 拓扑序计数的更多相关文章
- 「PKUWC2019」拓扑序计数(状压dp)
考场只打了 \(52\) 分暴力...\(ljc\) 跟我说了一下大致思路,我回去敲了敲. \(f[i]\) 表示状态为 \(i\) 时的方案数.我们用二进制 \(0/1\) 表示不选/选点 \(i\ ...
- [ARC083F] Collecting Balls [建二分图+环套树定向+建拓扑图+树的拓扑序计数]
题面 [传送门](https://arc083.contest.atcoder.jp/tasks/arc083_d) 思路 这是一道真正的好题 第一步:转化模型 行列支配类的问题,常见做法就是把行和列 ...
- Hdu 4661 树上拓扑序计数
#include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ; ], nxt[MAXM << ...
- 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
3832: [Poi2014]Rally Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 168 Solved: ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...
- poj3553 拓扑序+排序贪心
题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...
- poj2762 强连通+拓扑序
题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...
- poj1420 拓扑序
题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...
随机推荐
- sublimetext3官网安装
1. 下载 可以从官网 http://www.sublimetext.com/3 下载. 2. Windows下安装与使用2.1 安装 1. Win7 64位系统,可以下载 Windows 64 bi ...
- 控制器的view的加载优先级
拿到控制器后,控制器的view是在什么时候按照什么优先级创建加载的? 1.控制器内部的view是延迟加载 1> 用到时再加载(loadView) 2> 加载完毕后会调用控制器的viewDi ...
- C与C++
有幸在某网站发现这篇文章,读罢,觉得蛮有道理,发来大家一起共勉之! 总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复. 一家之言,欢迎拍砖哈. 1.可以考虑先学 ...
- kettle查询出来的真实值被识别为null
问题描述: 通过关联表查询出来的applyId(申请编号),在数据流里也是能看到的,但是在写入到数据表中的时候,由于设置了这个字段不能为空,所以一直报错. 问题实质: 数据流内存在的数据却不能保存,原 ...
- 理解javascript 回调函数
##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...
- CENTOS 挂载硬盘
查看物理卷:pvs 查看卷组:vgs 列出分区:lvs 查看磁盘:ll /dev/disk/by-path/ 扫描 LVM 找到 VG vgscan centos 下 mount: unknown f ...
- Composer的使用
安装 curl -sS https://getcomposer.org/installer | php 你可以使用--install-dir选项将Composer安装到指定的目录,例如: curl - ...
- Problem 1008 Hay Points
Problem Description Each employee of a bureaucracy has a job description - a few paragraphs that des ...
- ActionResult 之HttpGet HttpPost
GET一般用于获取和查询数据. 当浏览器发送HTTP GET 请求的时候,会找到使用HttpGet限定的对应Action. POST 一般用于更新数据. 当Action上面没有限定的时候,浏览器发送任 ...
- SQL Server 造成cpu 使用率高的 6 原因
第一种: 编译和重编译执行计划. 第二种: 排序与聚合. 第三种: 表格连接操作. 第四种: max degree of parallelism. 第五种: max worker threads. 第 ...