原题戳我

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. php删除文件夹和其下的内容

    原文地址:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/05/13/2045158.html <?php function del ...

  2. Bat 参数去引号(各种去引号的奇葩方式,三种变量互转),普通变量不能直接去掉外层引号

    很多情况下,我们需要脱除一个字符串中可能会存在的引号,然后在加上自己的引 号使其中的特殊字符(命令连接符& .| .&&.||,命令行参数界定符Space .tab . ; . ...

  3. AbelSu区块链应用场景收集

    1.基于智能合约的众筹 众筹项目的资金通常由一个中心化不可变更且开放的数据库来控制,这个数据库可以追踪所有出资人. 虽然如此,我们可以用一种去中心化的方式来实现,而且只要创建一个代币就可以追踪资金.一 ...

  4. 初识 ServiceWorker

    初识ServiceWorker 初识ServiceWorker 在8月份的时候.W3C更新了一个叫Service Workers的API. 了解过HTML5中的Web Worker的人可能会对这个AP ...

  5. springboot redis 监听过期key值事件

    redis 中的key值过期后,触发通知事件 1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <gr ...

  6. Gitlab+Jenkins学习之路(十四)之自动化脚本部署实践

    目录 一.环境说明和准备 1.环境说明 2.服务器准备工作 二.发布脚本编写 1.自动化部署流程设计 2.自动化部署脚本编写 三.发布测试 1.开发机和github添加ssh信任 2.克隆项目到开发机 ...

  7. 表单设置 disabled 后无法传值到后台的解决办法

    在提交 from 表单时,下面的 input 无法正常提交给后台, 发现,如果input的字段设为disabled,该表单是无法提交的. <input type="text" ...

  8. 基于.NET Standard的分布式自增ID算法--Snowflake代码实现

    概述 上篇文章介绍了3种常见的Id生成算法,本篇主要介绍如何使用C#实现Snowflake. 基础字段 /// <summary> /// 工作节点Id(长度为5位) /// </s ...

  9. 一个web应用的诞生(3)--美化一下

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...

  10. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...