AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011

题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人。

所以题目大意就是:

  给一个有向无环图,问加上一条我给定的边后,有多少个以1为根的树形图?n<=1e5,m<=2*1e5

原图无重边,加上的边可以为自环。

  

首先先来解决一个问题:

  一个有向无环图的树形图有多少个呢?

相当于除了根节点以外,每个点随意取一个入度,为什么就一棵树呢?每个点选一个父亲,并且保证没有环,所以是一棵树。

好的,对于有向无环图就一定是这样的,那么若加入一条边<x,y>,

那么就可能再选择的过程中选出一个环[就是祖先的父亲是自己这种情况]。那么我们就需要删去这种情况。

首先要出现环,则必定包括了<x,y>这条边,剩下的部分是原图中y->x的一条路径,要求这条路径上的点必须选择一条路径使得构成一个环。而其它的点可以随意选。

设F(i)表示y->i上的点所成路径必须选择一条能构成环路径的方案数。

有初始值:

递推式:

  

相当于j可以选择延续所有从y走来的i的路径,但是要除以j原本可以选择的路径总数。

最后答案=所有方案[入度乘积] - F(x)。

听说ZZD去年就想出来了这题,不过因为不会打逆元而失之交臂[不然就是省队了?%%%]

为什么会有逆元?...额我好像忘记说方案数要取模了...

那么这题中为了加速运算,就用了一个O(n)递推求1...n的所有逆元的方法,我也算是普及一下吧?...

画图的时候没太注意大小写,不要太在意...

那么i的逆元可以由p mod i的逆元得知了,这显然是一个已知的数,所以每次递推都是O(1)的,边界:1的逆元=1。

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; inline int in(){
int x=;char ch=getchar();
while(ch>'' || ch<'') ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return x;
} const int maxn=;
const int mod=1e9+;
typedef long long ll; struct Node{
int data,next;
}node[maxn<<]; #define now node[point].data
#define then node[point].next int n,m,ans,cnt,x,y;
int head[maxn],d[maxn],ld[maxn];
int f[maxn],stack[maxn],top;
int inv[maxn<<]; void init(){
inv[]=;
for(int i=;i<=m;i++)
inv[i]=(mod-(ll)inv[mod%i]*(mod/i)%mod)%mod;
} void add(int u,int v){
node[cnt].data=v;node[cnt].next=head[u];head[u]=cnt++;d[v]++;
} int power(int a,int k){
int ans=;
for(;k;k>>=){
if(k&) ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
}
return ans;
} int main(){
#ifndef ONLINE_JUDGE
freopen("maple.in","r",stdin);
freopen("maple.out","w",stdout);
#endif int u,v; n=in(),m=in();
x=in(),y=in();
init();
for(int i=;i<=n;i++) head[i]=-;
for(int i=;i<=m;i++)
u=in(),v=in(),add(u,v);
d[y]++;
ans=;
for(int i=;i<=n;i++) ans=(ll)ans*d[i]%mod;
if(y==){ printf("%d",ans);return ;}
else f[y]=(ll)ans*inv[d[y]]%mod; d[y]--;
memcpy(ld,d,sizeof(d));
for(int i=;i<=n;i++) if(!d[i]) stack[++top]=i; while(top){
u=stack[top--];
for(int point=head[u];point!=-;point=then){
if(--d[now]==)
stack[++top]=now;
f[now]=(f[now]+(ll)f[u]*inv[ld[now]]%mod)%mod;
}
} ans=(ans-f[x]+mod)%mod;
printf("%d",ans);
return ;
}

BZOJ 4011 HNOI2015 落忆枫音的更多相关文章

  1. BZOJ 4011: [HNOI2015]落忆枫音( dp )

    DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...

  2. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  3. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  4. 4011: [HNOI2015]落忆枫音

    4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...

  5. 【BZOJ】4011: [HNOI2015]落忆枫音

    题目链接:http://blog.csdn.net/popoqqq/article/details/45194103 写代码的时候也没有很清晰....具体看这里吧 #include<iostre ...

  6. bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)

    4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1125  Solved: 603[Submit][Statu ...

  7. [HNOI2015]落忆枫音 解题报告

    [HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...

  8. BZOJ4011: [HNOI2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  9. [HNOI2015]落忆枫音

    题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...

随机推荐

  1. Windows 2008 WinRM和WinRS能帮你做什么?

     介绍    WinRM及WinRS更新包含在Windows Vista, Windows Server 2003 R2, Windows Server 2008 (及 Server 2008 Cor ...

  2. "R6002 floating point support not loaded"错误

    R6002 floating point support not loaded 错误,在Debug模式下会弹出如下错误: "floating point support not loaded ...

  3. 【转】behave行为树学习使用第一天

    最近在学习使用行为树做AI,决定把学到的贡献出来,抛砖引玉,希望可以认识到更多大牛 -- 首先我们了解下什么是行为树和为什么要使用行为树.   在我们项目中如果需要做一个AI敌人,比如做一个手游 某民 ...

  4. PHP排序的几种方法

    // 冒泡排序 function BubbleSort($arr) { // 获得数组总长度 $num = count($arr); // 正向遍历数组 for ($i = 1; $i < $n ...

  5. Proteus中常用元器件名字

    运放   OPAMP 稳压管  zener MOS管 IRC 串口  COMPIM

  6. web标准,可用性和可访问性

    web标准,简单的说,是指html,css,JavaScript三者的分离. 网页由三部分组成:结构,表现和行为.对应的标准分为三方面: 1.结构化标准语言XHTML和XML2.表现标准语言主要包括c ...

  7. Codeforces Round #363 (Div. 2) B 暴力

    Description You are given a description of a depot. It is a rectangular checkered field of n × m siz ...

  8. JavaScript (JS)基础:DOM 浅析 (含数组Array、字符串String基本方法解析)

    ①文本对象document: 例如:document.getElementById()    只获取一个对象          document.getElementsByTagName()   获取 ...

  9. POJ3983 快算24

    很正常的题目,迷一样的答案. 测试数据只有一组,对没错只有一组. #include<cstdio> int main() { printf("5*(5-(1/5))\n" ...

  10. Visual Studio 试用版的评估期已经结束【解决方案】

    原文发布时间为:2010-01-09 -- 来源于本人的百度文章 [由搬家工具导入] Visual Studio 试用版的评估期已经结束…… 解决。2010年1月9日0:02:50,本人亲自尝试,可行 ...