题解

如果不加这条边,那么答案是所有点入度的乘积

加上了这条边之后,我们转而统计不合法的方案数

就是相当于统计一条路径从y到x,新图所有点度的乘积除上这条路径所有点的点度乘积

初始化为\(f[y] = \frac{\prod_{i = 2}^{n} ind[i]}{ind[y]}\)

转移按照拓扑序转移

如果u能到v

\(f[v] += \frac{f[u]}{ind[v]}\)

用总答案减掉f[x]即可

特判掉y = 1的情况

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define enter putchar('\n')
  8. #define space putchar(' ')
  9. #define MAXN 100005
  10. //#define ivorysi
  11. using namespace std;
  12. typedef long long int64;
  13. typedef long double db;
  14. typedef unsigned int u32;
  15. template<class T>
  16. void read(T &res) {
  17. res = 0;char c = getchar();T f = 1;
  18. while(c < '0' || c > '9') {
  19. if(c == '-') f = -1;
  20. c = getchar();
  21. }
  22. while(c >= '0' && c <= '9') {
  23. res = res * 10 + c - '0';
  24. c = getchar();
  25. }
  26. res *= f;
  27. }
  28. template<class T>
  29. void out(T x) {
  30. if(x < 0) {putchar('-');x = -x;}
  31. if(x >= 10) out(x / 10);
  32. putchar('0' + x % 10);
  33. }
  34. struct node {
  35. int to,next;
  36. }E[MAXN * 2];
  37. const int MOD = 1000000007;
  38. int N,M,x,y,head[MAXN],sumE,ind[MAXN],f[MAXN],c[MAXN],inv[MAXN];
  39. int mul(int a,int b) {
  40. return 1LL * a * b % MOD;
  41. }
  42. int inc(int a,int b) {
  43. return a + b >= MOD ? a + b - MOD : a + b;
  44. }
  45. int fpow(int x,int c) {
  46. int res = 1,t = x;
  47. while(c) {
  48. if(c & 1) res = mul(res,t);
  49. t = mul(t,t);
  50. c >>= 1;
  51. }
  52. return res;
  53. }
  54. void add(int u,int v) {
  55. E[++sumE].to = v;
  56. E[sumE].next = head[u];
  57. head[u] = sumE;
  58. }
  59. queue<int> Q;
  60. void BFS() {
  61. Q.push(1);
  62. while(!Q.empty()) {
  63. int u = Q.front();Q.pop();
  64. for(int i = head[u] ; i ; i = E[i].next) {
  65. int v = E[i].to;
  66. f[v] = inc(f[v],mul(f[u],inv[v]));
  67. --c[v];
  68. if(!c[v]) Q.push(v);
  69. }
  70. }
  71. }
  72. void Solve() {
  73. read(N);read(M);read(x);read(y);
  74. int u,v;
  75. for(int i = 1 ; i <= M ; ++i) {
  76. read(u);read(v);
  77. add(u,v);ind[v]++;
  78. }
  79. if(y == 1) {
  80. int ans = 1;
  81. for(int i = 2 ; i <= N ; ++i) ans = mul(ans,ind[i]);
  82. out(ans);enter;
  83. }
  84. else {
  85. f[y] = 1;
  86. for(int i = 2 ; i <= N ; ++i) {
  87. if(i != y) f[y] = mul(f[y],ind[i]);
  88. }
  89. for(int i = 1 ; i <= N ; ++i) {c[i] = ind[i];inv[i] = fpow(ind[i],MOD - 2);}
  90. BFS();
  91. int ans = 1;
  92. ++ind[y];
  93. for(int i = 2 ; i <= N ; ++i) ans = mul(ans,ind[i]);
  94. ans = inc(ans,MOD - f[x]);
  95. out(ans);enter;
  96. }
  97. }
  98. int main() {
  99. #ifdef ivorysi
  100. freopen("f1.in","r",stdin);
  101. #endif
  102. Solve();
  103. }

【LOJ】#2115. 「HNOI2015」落忆枫音的更多相关文章

  1. 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)

    [BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...

  2. 【BZOJ】【4011】【HNOI2015】落忆枫音

    拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/44487 ...

  3. BZOJ 4011 【HNOI2015】 落忆枫音

    题目链接:落忆枫音 以下内容参考PoPoQQQ大爷的博客 首先我们先来考虑一下如果没有新加入的那条边,答案怎么算. 由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形 ...

  4. 【bzoj4011 hnoi2015】落忆枫音

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

  5. 「HNOI 2015」落忆枫音

    题目链接 戳我 \(Description\) 给一张\(n\)割点\(m\)条边的\(DAG\),保证点\(1\)不存在入边,现在需要在\(DAG\)中加入一条不在原图中的边\((x,y)\),求这 ...

  6. 【HNOI2015】落忆枫音

    题面 题解 求一个有特殊性质的有向图的生成树的个数. 首先,有向图的生成树的个数可以用矩阵树定理,能够得到\(40\)分. 但是如果它是一个\(\mathrm{DAG}\)就很好做,枚举每一个点的父亲 ...

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

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

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

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

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

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

随机推荐

  1. 【题解】 bzoj1911: [Apio2010]特别行动队 (动态规划+斜率优化)

    bzoj1911,懒得复制,戳我戳我 Solution: 线性DP(打牌) \(dp\)方程还是很好想的:\(dp[i]=dp[j-1]+a*(s[i]-s[j-1])^2+b*(s[i]-s[j-1 ...

  2. maven搭建springmvc+mybatis项目

    上一篇中已经成功使用maven搭建了一个web项目,本篇描述在此基础上怎么搭建一个基于springmvc+mybatis环境的项目. 说了这么久,为什么那么多人都喜欢用maven搭建项目?我们都知道m ...

  3. 【BZOJ1025】[SCOI2009]游戏(动态规划)

    [BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...

  4. Problem A: 选举 解题报告

    Problem A: 选举 题意 给出一个投票过程.有\(n\)个选民和\(m\)个候选人,每个选民\(i\)有个不重且有序的可投集合\(\{a_i\}\). 对于第一轮投票,选民\(i\)会投给\( ...

  5. CF1110D Jongmah(DP)

    题目链接:CF原网  洛谷 题目大意:有 $n$ 个数,每个都不超过 $m$.一个三元组 $(a,b,c)$ 是合法的当且仅当 $a=b=c$ 或者 $a+1=b=c-1$.每个数只能用一次.问最多能 ...

  6. Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)

    # 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...

  7. CentOS 7.4 java验证码乱码的问题

     转载阿里云 摘要: 新服务器配置发布网站 配置后程序顺利启动在登录时发现验证码无法识别显示出了图片,但是字是乱码 初步估计应该是字体问题 ssh登录服务器查看默认字体 #fc-match msam1 ...

  8. Oracle DBMS_RANDOM

    DBMS_RANDOM.VALUE -- [0,1)的38位精度小数 SELECT DBMS_RANDOM.VALUE FROM DUAL; -- [10,20)的38位精度小数 SELECT DBM ...

  9. python---django中orm的使用(3)admin配置与使用

    新建项目,并开启 python manage.py runserver 访问admin页面 http://127.0.0.1:8080/admin 补充:若是发现admin页面样式丢失:可能是因为在s ...

  10. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...