【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我
Solution:
(部分复制Navi_Aswon博客)
解释博客中的两个小地方:
\]
- 因为加了\(x\)到\(y\)这条边出现了环,所以环上一定有一条边是从\(x\)连向\(y\),所以在没有这条边时,能从\(y\)连向\(x\)的方案都是不满足的。
- 因此,上面这个式子就是找出了一条从\(y\)至\(x\)的路径后,连边的方案数。可以看作,\(y\)到\(x\)路径上的所有边都固定只连向环中的下一个点,所以方案数就是其他不在环上的点的入度乘积
\]
这个式子用\(degree\)总乘积除掉环路径上的点后的乘积之和,也就是不同环到这个点来后的方案和,所以最后\(f[x]\)就是所有存在环的方案数。注意的理解的点就是,\(f[ ]\)不是一个固定的环存在的不能满足方案数,而是所有环的情况方案数之和
另外还用到了费马小定律求逆元,\(1e9+7\)是质数
是一道需要好好理解好好思考的题目
Code:
//It is coded by Ning_Mew on 3.17
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e5+7;
const int MOD=1e9+7;
int n,m,x,y;
int head[maxn],cnt=0;
struct Edge{
int nxt,to;
}edge[2*maxn];
int degree[maxn],in[maxn];
LL ans=0,f[maxn];
void add(int from,int to){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
LL q_pow(int x,int k){
LL box=1ll*x,ans=1;
while(k){
if(k%2)ans=ans*box%MOD;
box=box*box%MOD;
k=k/2;
}return ans;
}
void topsort(){
queue<int>q;
while(!q.empty())q.pop();
for(int i=1;i<=n;i++){if(in[i]==0)q.push(i);}
while(!q.empty()){
int u=q.front();q.pop();
f[u]=f[u]*q_pow(degree[u],MOD-2)%MOD;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;
in[v]--;f[v]=(f[v]+f[u])%MOD;
if(in[v]==0)q.push(v);
}
}return;
}
int main(){
scanf("%d%d%d%d",&n,&m,&x,&y);
degree[y]++;
for(int i=1;i<=m;i++){
int a,b;scanf("%d%d",&a,&b);
add(a,b);degree[b]++;
}
ans=1;
for(int i=2;i<=n;i++){
in[i]=degree[i];
ans=1ll*ans*degree[i]%MOD;
}
in[1]=degree[1];
in[y]--; f[y]=ans;
if(y!=1)topsort();
printf("%lld\n",(ans-f[x]+MOD)%MOD);
return 0;
}
【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)的更多相关文章
- bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...
- BZOJ 4011: [HNOI2015]落忆枫音( dp )
DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...
- bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)
4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1125 Solved: 603[Submit][Statu ...
- [HNOI2015]落忆枫音 解题报告
[HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...
- 4011: [HNOI2015]落忆枫音
4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...
- 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp
题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...
- [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)
传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...
- 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】
组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n\) 个穴位,穴位的编号为 \(1\sim n\).有若干条有向的脉络连接着这些穴位. ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
随机推荐
- 第16章 STM32中断应用概览
第16章 STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- excel中散点图和折线图的区别(散点图时间均匀分布)
折线图可以显示随单位(如:单位时间)而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势.散点图显示若干数据系列中各数值之间的关系,或者将两组数绘制为 xy 坐标的一个系列.-------- ...
- 【js】AddFavorite/SetHome提醒用户自行操作加入收藏/设置主页
除了老版本的ie, 就已经没有浏览器能支持js添加收藏夹和设置首页, 浏览器没有开放这个权限了,external.addFavorite这个给禁了. 不过AddFavorite可以起到提醒用户自行操作 ...
- ME_PROCESS_PO_CUST 实现采购订单行项目增强
用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...
- 20155334 曹翔 Exp2 后门原理与实践
20155334 曹翔 Exp2 后门原理与实践 不多废话直接上实验过程,本实验的所有端口都是5334. 一.实验过程 查询主机Windows和虚拟机kali的ip地址: Windows获得Linux ...
- maven中添加jetty运行插件
maven项目,用jetty插件运行,对热部署的支持比较好.maven的pom文件加入下面代码 <plugin> <groupId>org.mortbay.je ...
- AlarmManager守护服务和隐藏桌面图标
1.主要内容 本章记录几段常用代码: 1.如何使用AlarmManager守护服务2.如何判断某服务是否正在运行 2.如何暂时禁用Android的组件 2.使用AlarmManager守护服务 Boo ...
- stl源码剖析 详细学习笔记 算法(3)
//---------------------------15/03/30---------------------------- //min_element template<class Fo ...
- stl源码剖析 详细学习笔记deque(3)
protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...
- web api token验证理解
最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 ...