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=0;char ch=getchar();while(ch>'9' || ch<'0') ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}const int maxn=100010;
const int mod=1e9+7;
typedef long long ll;struct Node{int data,next;
}node[maxn<<1];#define now node[point].data
#define then node[point].nextint n,m,ans,cnt,x,y;
int head[maxn],d[maxn],ld[maxn];
int f[maxn],stack[maxn],top;
int inv[maxn<<1];void init(){inv[1]=1;for(int i=2;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=1;for(;k;k>>=1){if(k&1) ans=(ll)ans*a%mod;a=(ll)a*a%mod;}return ans;
}int main(){
#ifndef ONLINE_JUDGEfreopen("maple.in","r",stdin);freopen("maple.out","w",stdout);
#endifint u,v;n=in(),m=in();x=in(),y=in();init();for(int i=1;i<=n;i++) head[i]=-1;for(int i=1;i<=m;i++)u=in(),v=in(),add(u,v);d[y]++;ans=1;for(int i=2;i<=n;i++) ans=(ll)ans*d[i]%mod; if(y==1){ printf("%d",ans);return 0;}else f[y]=(ll)ans*inv[d[y]]%mod;d[y]--;memcpy(ld,d,sizeof(d));for(int i=1;i<=n;i++) if(!d[i]) stack[++top]=i;while(top){u=stack[top--];for(int point=head[u];point!=-1;point=then){if(--d[now]==0)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 0;
}

View Code

转载于:https://www.cnblogs.com/Robert-Yuan/p/5241268.html

BZOJ 4011 HNOI2015 落忆枫音相关推荐

  1. P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)

    P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...

  2. [HNOI2015] 落忆枫音

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

  3. Bzoj4011 [HNOI2015]落忆枫音

    Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 983  Solved: 533 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫 ...

  4. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)

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

  5. bzoj4011[HNOI2015]落忆枫音

    http://www.lydsy.com/JudgeOnline/problem.php?id=4011 记新加入的边的起点为$x$,终点为$y$ 首先,我们先考虑新加入的边没有构成环的情况,即在原图 ...

  6. [HNOI2015]落忆枫音

    题目描述 不妨假设枫叶上有 n个穴位,穴位的编号为 1 ~  n.有若干条有向的脉络连接 着这些穴位.穴位和脉络组成一个有向无环图--称之为脉络图(例如图 1),穴 位的编号使得穴位 1 没有从其他穴 ...

  7. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)

    原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...

  8. luogu3244 bzoj4011 HNOI2015 落忆枫音

    这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...

  9. luogu P3244 [HNOI2015]落忆枫音

    传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...

最新文章

  1. 《Effective Java读书笔记》--序列化
  2. 关于transform的3D变形函数
  3. Leetcode5633. 计算力扣银行的钱[C++题解]:模拟简单
  4. linux web 服务器性能,Linux系统Web服务器性能测试(2)
  5. NYOJ276 比较字母大小
  6. mysql 关闭in自动排序_为什么MySQL的in查询会自动排序
  7. 開博客了, 因為搞Delphi 開發的關於Delphi學習
  8. 了解编译原理-笔记小结
  9. Tizen已经够烂了 但份额还是超过了黑莓
  10. 用C语言编译病毒,来来来,教你一个用C语言写个小病毒
  11. Unity 接入有道智云AI - 文档翻译
  12. Linux权限的理解 | 粘滞位 |权限掩码 |文件类型
  13. php中select from,关于php:SELECT * FROM MySQLi
  14. caffe SSD 代码编译运行流程及问题解决
  15. 如何使计算机理解中医药知识,计算机技术在中医药信息学应用概
  16. PCB Layout设计规范-通用篇
  17. SpringBoot构建电商基础秒杀项目知识点总结(第3章)
  18. 你知道S7-200 SMART和S7-200的区别吗?
  19. iOS 在其它APP中通过本APP打开的文件如何保存至本APP,然后使用
  20. 使用Nero软件刻录ISO系统盘

热门文章

  1. mysql数学函数有什么_mysql数学函数有哪些?
  2. [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...
  3. Linuxqt制作文本编辑器_Python实操!速收藏!学习使用Python创建文本编辑器应用程序
  4. Ubuntu安装ASIO开发库
  5. ceres-solver库使用示例
  6. ios xib 初始化高度_iOS图片伸缩技巧
  7. springboot整合ssm(mybatis)
  8. AnySDK项目实战教程
  9. python登录接口测试_接口测试,基于Python
  10. ros多机通讯的办法