题目描述                     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. php.ini中最好禁止的一些函数

    phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息. 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级 ...

  2. Eclipse - JAR包制作细节

    Eclipse - JAR包制作细节   1.Jar包分为两种,一种是不可运行的,一种是可运行的Jar包,他们的主要区别如下:     > 不可直接运行的Jar包主要是用于给别的程序提供调用   ...

  3. HttpApplication事件执行顺序(转)

    HttpApplication 类的实例(Global继承自该类)是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的.HttpApplication 类的一个实例在其生存期内被用于处理多个 ...

  4. html基础之 input:type

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍.1,type=text输入类型是text,这是我们见的最多 ...

  5. C/c++几个预定义的宏:__DATE__,__TIME__,__FILE__,__LINE__

    一边情况下,C/C++编译器会内置几个宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __ ...

  6. (转+原)android获取系统时间

    参考的网站如下: http://c.biancheng.net/cpp/html/144.html http://www.linuxidc.com/Linux/2012-03/55909.htm 代码 ...

  7. 【搜索引擎Jediael开发笔记】v0.1完整代码

    详细代码请见 E:\Project\[重要]归档代码\SearchEngine归档代码 或 https://code.csdn.net/jediael_lu/jediael/tree/10991c83 ...

  8. Python Tkinter canvas oval原理

    Ovals, mathematically, are ellipses, including circles as a special case. The ellipse is fit into a ...

  9. 分析BGARefreshLayout-master

    一.知识点,创建BaseActivity 建立方法的逻辑顺序 并将一些常用的方法填充到其中 ①.将initView().setListener().onClick().processLogic()方法 ...

  10. 1021 Fibonacci Again (hdoj)

    Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) ...