# 拓扑排序+DP

通过转化……路径外的$degree_i$的乘积转化成所有点的degree之积除以路径内的，所以用到逆元……

PoPoQQQ的线性筛逆元好神奇啊……>_< OrzOrz

 1 /**************************************************************
2     Problem: 4011
3     User: Tunix
4     Language: C++
5     Result: Accepted
6     Time:784 ms
7     Memory:10648 kb
8 ****************************************************************/
9
10 //Huce #7 A
11 #include<vector>
12 #include<cstdio>
13 #include<cstdlib>
14 #include<cstring>
15 #include<iostream>
16 #include<algorithm>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 using namespace std;
21
22 int getint(){
23     int v=0,sign=1; char ch=getchar();
24     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
25     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
26     return v*sign;
27 }
28 typedef long long LL;
29 const int N=200010,P=1e9+7,INF=~0u>>2;
30 /*******************template********************/
34 }
35 int n,m,s,t,du[N],in[N];
36 LL inv[N],f[N],ans=1;
37 void Linear_Shaker(){
38     int i;
39     for(inv[1]=1,i=2;i<=m+1;i++)
40         inv[i]=(P-P/i)*inv[P%i]%P;
41 }
42 int Q[N];
43 void tpsort(){
44     int l=0,r=-1;
45     f[t]=ans;
46     F(i,1,n) if (!du[i]) Q[++r]=i;
47     while(l<=r){
48         int x=Q[l++];
49         f[x]=(f[x]*inv[du[x]])%P;
51             (f[to[i]]+=f[x])%=P;
52             if (!--in[to[i]]) Q[++r]=to[i];
53         }
54     }
55 }
56 int main(){
57 #ifndef ONLINE_JUDGE
58     freopen("A.in","r",stdin);
59 //  freopen("output.txt","w",stdout);
60 #endif
61     n=getint(); m=getint(); s=getint(); t=getint();
62     Linear_Shaker();
63     int x,y;
64     F(i,1,m){
65         x=getint(); y=getint();
67         in[y]++; du[y]++;
68     }
69     du[t]++;
70     F(i,2,n) ans=(ans*du[i])%P;
71     if (t==1){
72         printf("%lld\n",ans);
73     }else{
74         tpsort();
75         printf("%lld\n",(ans-f[s]+P)%P);
76     }
77     return 0;
78 }
View Code

## 4011: [HNOI2015]落忆枫音

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 133  Solved: 64
[Submit][Status][Discuss]

## Description

【问题描述】

-  1 条脉络组成，脉络树里没有环，亦不存在从一个穴位连向自身的脉络，且对于

r 出发沿着这条路径可以到达穴位 s。

## Output

输出一行，为添加了从穴位 x连向穴位 y的脉络后，枫叶上以穴位 1 为根的脉

4 4 4 3
1 2
1 3
2 4
3 2

3

## HINT

对于所有测试数据，1 <= n <= 100000，n - 1 <= m <= min(200000, n(n – 1) / 2)，

1 <= x, y, ui, vi <= n。

## Source

[Submit][Status][Discuss]
posted @ 2015-04-23 18:46  Tunix  阅读(646)  评论(3编辑  收藏  举报