题目描述                     Description

求一颗有根树/树形图的拓扑序个数.

输入描述                 Input Description              

第一行一个n和一个素数P,表示这颗树有n个节点,要求拓扑序个数modP之后的结果.

接下来n-1行,每行有两个数字x和y,表示x是y的父亲.

保证1<=n<=1500000, n<P<2^31,P为质数.

输出描述                 Output Description              

一行一个数字,为该树形图拓扑序个数modP的结果.

样例输入                 Sample Input              

样例1 4 100000007 1 2 1 3 2 4
样例2 6 100000007 1 2 2 3 1 4 3 5 5 6

样例输出                 Sample Output              

样例1 3
样例2 5

数据范围及提示                 Data Size & Hint              

每个非根节点的儿子个数平均较多,数据量较大,建议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 拓扑序计数的更多相关文章

  1. 「PKUWC2019」拓扑序计数(状压dp)

    考场只打了 \(52\) 分暴力...\(ljc\) 跟我说了一下大致思路,我回去敲了敲. \(f[i]\) 表示状态为 \(i\) 时的方案数.我们用二进制 \(0/1\) 表示不选/选点 \(i\ ...

  2. [ARC083F] Collecting Balls [建二分图+环套树定向+建拓扑图+树的拓扑序计数]

    题面 [传送门](https://arc083.contest.atcoder.jp/tasks/arc083_d) 思路 这是一道真正的好题 第一步:转化模型 行列支配类的问题,常见做法就是把行和列 ...

  3. Hdu 4661 树上拓扑序计数

    #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ; ], nxt[MAXM << ...

  4. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  5. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  6. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  7. poj3553 拓扑序+排序贪心

    题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...

  8. poj2762 强连通+拓扑序

    题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...

  9. poj1420 拓扑序

    题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...

随机推荐

  1. React-Native post和get请求

    post: fetchData (title) { fetch(REQUEST_URL, { method: 'POST', headers: { 'Accept': 'application/jso ...

  2. 详解AJAX核心 —— XMLHttpRequest 对象 (下)

    继续上一篇的内容上一篇关于XMLHttpRequest 对象发送对服务器的请求只说到了用Get方式,没有说Post方式的.那是因为要说Post方式就需要先说另外一个东西,那就是DOM(Document ...

  3. css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法

    Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...

  4. C# 添加服务引用。

    1,服务引用给的实例(需要一个网址连接) http://192.168.17.131:12170/amtiot.gis.WCF/SpatialAnalysis.svc  (类似于这样的一个网址) 在网 ...

  5. vb的property 和event

    Event 语句 定义用户自定义的事件. 语法 [Public] Event procedurename [(arglist)] Event 语句包含下面部分: 部分 描述 Public 可选的.指定 ...

  6. 【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象

    一.概述 1.对于一个搜索而言,其核心语句为: searcher.search(query, 10); 此时,其最重要的参数为一个Qeury对象.构造一个Query对象有2种方法: (1)使用Quer ...

  7. 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

    1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...

  8. UVA 10129 Play on Words

    欧拉回路 以字母为结点,单词为边:注意两个相同的单词表示两条边. 并查集判断是否连通,出度,入度判断是否是欧拉回路 #include <iostream> #include <cst ...

  9. SAR数据下载网站

    1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.144.2153&rep=rep1&type=pdf[2] ht ...

  10. CSS3 设置 Table 隔行变色

    table tr:nth-child(odd){background:#F4F4F4;} table td:nth-child(even){color:#C00;}