题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103

      http://www.cnblogs.com/mmlz/p/4448742.html

  通过转化……路径外的$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********************/
31 int to[N<<1],next[N<<1],head[N],cnt;
32 void add(int x,int y){
33     to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
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;
50         for(int i=head[x];i;i=next[i]){
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();
66         add(x,y);
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

相关文章:

  • 2022-12-23
  • 2021-12-07
  • 2021-09-06
猜你喜欢
  • 2021-08-31
  • 2021-06-09
  • 2022-01-19
  • 2021-12-17
  • 2021-12-04
  • 2021-12-26
  • 2021-11-19
相关资源
相似解决方案