原题戳我

Solution:

(部分复制Navi_Aswon博客

解释博客中的两个小地方:

\[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j∉S)}degree_j
\]

  • 因为加了\(x\)到\(y\)这条边出现了环,所以环上一定有一条边是从\(x\)连向\(y\),所以在没有这条边时,能从\(y\)连向\(x\)的方案都是不满足的。
  • 因此,上面这个式子就是找出了一条从\(y\)至\(x\)的路径后,连边的方案数。可以看作,\(y\)到\(x\)路径上的所有边都固定只连向环中的下一个点,所以方案数就是其他不在环上的点的入度乘积

\[f_i=\frac{∑\left(j→i\right)*f_j}{degree_i}
\]

  • 这个式子用\(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+容斥原理)的更多相关文章

  1. bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...

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

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

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

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

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

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

  5. 4011: [HNOI2015]落忆枫音

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

  6. 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp

    题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...

  7. [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)

    传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...

  8. 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】

    组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n​\) 个穴位,穴位的编号为 \(1\sim n​\).有若干条有向的脉络连接着这些穴位. ...

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

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

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

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

随机推荐

  1. 第16章 STM32中断应用概览

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  2. excel中散点图和折线图的区别(散点图时间均匀分布)

    折线图可以显示随单位(如:单位时间)而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势.散点图显示若干数据系列中各数值之间的关系,或者将两组数绘制为 xy 坐标的一个系列.-------- ...

  3. 【js】AddFavorite/SetHome提醒用户自行操作加入收藏/设置主页

    除了老版本的ie, 就已经没有浏览器能支持js添加收藏夹和设置首页, 浏览器没有开放这个权限了,external.addFavorite这个给禁了. 不过AddFavorite可以起到提醒用户自行操作 ...

  4. ME_PROCESS_PO_CUST 实现采购订单行项目增强

    用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...

  5. 20155334 曹翔 Exp2 后门原理与实践

    20155334 曹翔 Exp2 后门原理与实践 不多废话直接上实验过程,本实验的所有端口都是5334. 一.实验过程 查询主机Windows和虚拟机kali的ip地址: Windows获得Linux ...

  6. maven中添加jetty运行插件

            maven项目,用jetty插件运行,对热部署的支持比较好.maven的pom文件加入下面代码 <plugin> <groupId>org.mortbay.je ...

  7. AlarmManager守护服务和隐藏桌面图标

    1.主要内容 本章记录几段常用代码: 1.如何使用AlarmManager守护服务2.如何判断某服务是否正在运行 2.如何暂时禁用Android的组件 2.使用AlarmManager守护服务 Boo ...

  8. stl源码剖析 详细学习笔记 算法(3)

    //---------------------------15/03/30---------------------------- //min_element template<class Fo ...

  9. stl源码剖析 详细学习笔记deque(3)

    protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...

  10. web api token验证理解

    最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 ...