正题

题目链接:https://www.luogu.com.cn/problem/P3244


题目大意

给出一个\(\text{DAG}\),保证\(1\)可以到达所有点。然后再加入一条边(之后不一定是\(\text{DAG}\))。

求有多少棵以\(1\)为根的外向生成树。

\(1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\)


解题思路

发现不考虑加边都不会做/kk

其实结论不难想也很显然,就是除了一号点以外所有点的入度乘积(每个点选择一个父亲,因为是\(\text{DAG}\)所以一定没有环)

然后加一条边怎么搞,因为可能会生成环。

可以考虑直接减去环的方案,设\(del\)表示加边前的总方案,那么对于每个环上所有点的度数乘积\(k\),需要减去的方案就是\(\frac{del}{k}\)。

现在考虑如何计算所有点的度数乘积的倒数和。

不难搞,直接\(\text{DAGdp}\)或者记亿化\(dp\)随便搞搞都可以

时间复杂度\(O(n+m)\)(如果线性预处理了逆元的话)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,P=1e9+7;
struct node{
ll to,next;
}a[N<<1];
ll n,m,u,v,tot,ls[N],deg[N],g[N];
bool vis[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void addl(ll x,ll y){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;return;
}
void dfs(ll x){
if(vis[x])return;vis[x]=1;
if(x==u){g[x]=power(deg[x],P-2)%P;return;}
for(ll i=ls[x];i;i=a[i].next)
dfs(a[i].to),(g[x]+=g[a[i].to])%=P;
g[x]=g[x]*power(deg[x],P-2)%P;
}
signed main()
{
scanf("%lld%lld%lld%lld",&n,&m,&u,&v);
for(ll i=1;i<=m;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
addl(x,y);deg[y]++;
}
deg[1]++;ll ans=1,del=1;
for(ll i=1;i<=n;i++)
ans=ans*(deg[i]+(i==v))%P,del=del*deg[i]%P;
dfs(v);
printf("%lld\n",(ans-g[v]*del%P+P)%P);
}

最新文章

  1. idea jrebel6 安装,破解
  2. centos 7 DenyHosts 安装 防暴力破解ssh登陆
  3. Radeon HD 7850 vs Radeon R9 270X
  4. Android数据库(sqlite)加密方案
  5. Qt for iOS,Qt 与Objective C混合编程
  6. codevs1404字符串匹配
  7. css案例学习之div ul li a 实现导航效果
  8. JS中获取页面单选框radio和复选框checkbox中当前选中的值
  9. 理解zookeeper选举机制
  10. Java 9 揭秘(17. Reactive Streams)
  11. 一步一步学习Vue(十一)
  12. 关于 DropDownList 循环绑定中遇到的问题
  13. scrapy爬虫框架setting模块解析
  14. load和DOMContenLoaded的区别
  15. 使用window.performance分析web前端性能
  16. ROS多根adsl叠加负载均衡PCC的做法
  17. Elasticsearch 分片路由原理指定分片存储查询
  18. 在django中使用FormView,success_url死活不能生效的问题
  19. vue 高级属性父组件provide向子组件发送数据,子组件通过inject接收数据
  20. adb 脚本

热门文章

  1. 在C#中使用C++编写的类——用托管C++进行封装
  2. await 关键字 后面跟Task 和Task &lt;T&gt;
  3. PipedInputStream and PipedOutputStream example
  4. 设置 Qt GUI程序 printf输出到独立控制台
  5. Mybatis原理和代码剖析
  6. FeignClient注解属性configuration不生效问题排查思路
  7. Ajax重构
  8. Python - 面向对象编程 - 多继承
  9. Android App性能测试之adb命令
  10. Linux从头学11:理解了这三个概念,才能彻底理解任务管理和任务切换