P3244 [HNOI2015]落忆枫音
思路
给出了一个DAG,要求以1为根的外向树的个数
如果没有加边的条件,就非常好做
每个点都只保留一条入边,最后得到的一定就是一个符合条件的树了(因为给了一个DAG啊)
所以答案是\(\prod_{i=2}^nd_i\)
加上一条边时候,可能会出现环的情况,要把它去掉
假设环中的点是\(a_1,a_2,a_3,\dots,a_k\),去掉的情况数就是\(\frac{\prod_{i=2}^nd_i}{\prod_{i=1}^kd_{a_i}}\)(除了环上的点之外其他随便选,成环只有环上的点每个点都选择环上的边的一种情况)
对后面的式子在原DAG上直接拓扑求一下就好了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
const int MOD = 1000000007;
int n,m,x,y;
int u[100100<<1],v[100100<<1],fir[100100],nxt[100100<<1],d[100100],cnt,f[100100],ans,d_t[100100];
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
d[vi]++;
d_t[vi]++;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(ans*a)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return ans;
}
queue<int> q;
void topu(void){
f[y]=ans;
for(int i=1;i<=n;i++)
if(!d_t[i])
q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
f[x]=(f[x]*pow(d[x],MOD-2))%MOD;
for(int i=fir[x];i;i=nxt[i]){
f[v[i]]=(f[v[i]]+f[x])%MOD;
d_t[v[i]]--;
if(!d_t[v[i]])
q.push(v[i]);
}
}
}
signed main(){
scanf("%lld %lld %lld %lld",&n,&m,&x,&y);
d[y]++;
for(int i=1;i<=m;i++){
int a,b;
scanf("%lld %lld",&a,&b);
addedge(a,b);
}
ans=1;
for(int i=2;i<=n;i++)
ans=(ans*d[i])%MOD;
if(y==1){
printf("%lld\n",ans);
return 0;
}
topu();
printf("%lld\n",(ans-f[x]+MOD)%MOD);
return 0;
}
P3244 [HNOI2015]落忆枫音的更多相关文章
- [bzoj4011] [洛谷P3244] [HNOI2015] 落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...
- 洛谷P3244 [HNOI2015]落忆枫音
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...
- luogu P3244 [HNOI2015]落忆枫音
传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i=2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点 ...
- 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]落忆枫音
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- [HNOI2015]落忆枫音
题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...
随机推荐
- .NET Core Tools for Visual Studio 2015 安装失败
You may be blocked from installing the .NET Core Tooling Preview 2 for Visual Studio 2015 installer ...
- Robot Framework 教程 (3) - Resource及关键字 的使用
From:http://www.cnblogs.com/buaawp/p/4754399.html Robot Framework 教程 (3) - Resource及关键字 的使用 在进行软件自动化 ...
- Python - 2. Built-in Collection Data Types
From: http://interactivepython.org/courselib/static/pythonds/Introduction/GettingStartedwithData.htm ...
- crm
CRM 开发 需求分析 存储所有的客户咨询信息 避免重复数据 客户的多次跟踪记录 客户来源.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级管理 学员成绩,出勤管理 问卷调查 校区管理 ...
- superblock 区块数据读取
鸟哥私房菜笔记: 命令:df -Th Filesystem:代表该文件系统是在哪个 partition ,所以列出设备名称:1k-blocks:说明下面的数字单位是 1KB 呦!可利用 -h 或 -m ...
- 设计模式之Factory(工厂)(转)
定义:提供创建对象的接口. 为何使用? 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就 ...
- Windows 7关闭睡眠(休眠)模式和删除休眠文件
原文地址:https://www.192ly.com/pc/win7/gb-sm.html 怎么关闭Windows 7关闭睡眠(休眠)功能?Windows 7系统中怎么删除休眠文件?Windows 7 ...
- 收音机FM和AM的区别
1.频率区别 FM = Frequency Modulation 调频,微波:微波传输,信号质量高,传输成本低,发射功率小,覆盖范围小,受地理因素影响较大,一般作为城市广播的首选.比如你的家乡城市台, ...
- JustOj 1032: 习题6.7 完数
题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数". 编程序找出N之内的所有完数, ...
- bzoj2656 [Zjoi2012]数列(sequence)
题目链接 好久没写高精度了,调了很久QAQ 如果直接递归计算答案的话肯定会T 发现一个数不管是分成一奇一偶还是直接>>1,都会重复计算很多东西 我们只需要在递归的时候实时维护一个xx(an ...