• 【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/ 转载请注明出处,侵权必究,保留最终解释权!
  • 相关阅读:
    微信开发者工具怎么下载
    YII框架get,post传参
    yii提示您提交的数据无法被验证
    解决[Err] 1055
    mysql日期默认值格式('0000-00-00')错误解决
    phpstorm 2018破解版 2018.2下载安装和JetbrainsCrack.jar激活教程
    PHP代码优化
    对B/S 和 C/S 架构的理解
    关于 API 安全的问题
    2020年终总结
  • 原文地址:https://www.cnblogs.com/Dragon-Light/p/6427350.html
Copyright © 2020-2023  润新知