zoukankan      html  css  js  c++  java
  • 【BZOJ】4011: [HNOI2015]落忆枫音

    题目链接:http://blog.csdn.net/popoqqq/article/details/45194103


    写代码的时候也没有很清晰....具体看这里

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<vector>
     5 #include<cstdlib>
     6 #include<cmath>
     7 #include<cstring>
     8 #include<queue>
     9 using namespace std;
    10 #define maxn 1001000
    11 #define md 1000000007
    12 #define llg long long 
    13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
    14 llg n,m,s,y,f[maxn],du[maxn],indu[maxn],ans,t;
    15 struct node
    16 {
    17     llg po;
    18     bool operator<(const node&a) const{
    19         return du[a.po]<du[po];
    20     }
    21 };
    22 
    23 vector<llg>a[maxn];
    24 
    25 priority_queue<llg>q;
    26 
    27 llg inv(llg x)
    28 {
    29     llg b=md-2;
    30     llg sum=1;
    31     while (b)
    32     {
    33         if (b&1) sum*=x,sum%=md;
    34         x*=x; x%=md;
    35         b/=2;
    36     }
    37     return sum;
    38 }
    39 
    40 void init()
    41 {
    42     llg x,y;
    43     cin>>n>>m>>s>>t;
    44     du[t]++,indu[t]++;
    45     for (llg i=1;i<=m;i++)
    46     {
    47         scanf("%lld%lld",&x,&y);
    48         a[x].push_back(y),du[y]++; indu[y]++;
    49     }
    50     ans=1;
    51     f[t]=1;
    52     for (llg i=2;i<=n;i++) ans*=indu[i],ans%=md,f[t]*=indu[i],f[t]%=md;
    53 }
    54 
    55 void DP()
    56 {
    57     llg x;
    58     for (llg i=1;i<=n;i++) if (!du[i]) q.push(i);
    59     du[t]--; 
    60     while (!q.empty())
    61     {
    62         x=q.top(); q.pop();
    63         f[x]*=inv(indu[x]); f[x]%=md;
    64         llg w=a[x].size();
    65         for (llg i=0;i<w;i++)
    66         {
    67             llg y=a[x][i];
    68             f[y]+=f[x],f[y]%=md;
    69             du[y]--;
    70             if (!du[y]) q.push(y);
    71         }
    72     }
    73 }
    74 
    75 int main()
    76 {
    77     yyj("tree");
    78     init();
    79     if (t==1) {cout<<ans; return 0;}
    80     DP();
    81     ans-=f[s]; ans+=md; ans%=md;
    82     cout<<ans;
    83     return 0;
    84 }
    本文作者:xrdog 作者博客:http://www.cnblogs.com/Dragon-Light/ 转载请注明出处,侵权必究,保留最终解释权!
  • 相关阅读:
    SSM后台管理开发日志(三)
    文件权限
    adb详细教学
    adb基础命令001
    SQL训练题库002(建议copy到sqlserver里实战练习,多做一下)
    SQL增删改查,列的更改,更改列名表名,运算符连接符,注释
    SQL增加约束
    SQL 建表、删表和数据,增删约束
    The firstday i join in cnblogs..."Hello everyone"...
    C#日期时间格式化
  • 原文地址:https://www.cnblogs.com/Dragon-Light/p/6427350.html
Copyright © 2011-2022 走看看