• 测试32:chemistry


    对于任意两个事件 X, Y :
    E(X + Y ) = E(X) + E(Y ) 。
    对于两个相互独立事件 X, Y :
    E(XY ) = E(X)E(Y )
    因此,对于两个相互独立事件 X, Y ,有:
    E((X + Y ) j ) = ∑ j k=0 C jk E(X k ) E(Y j−k )

    但是对于E(X^k)*E(Y^0)和E(X^0)*E(Y^k)要根据题目含义单独考虑。

    x&&y:E(X^0)=P*1

    x||y:E(X^0)=1

    y依附于x:E(Y^0)=1,E(X^0)=P;

    灵活考虑,不要拘泥于式子。

    #include<bits/stdc++.h>
    #define F(i,a,b) for(rg int i=a;i<=b;++i)
    #define rg register
    #define pf(a) printf("%lld ",a)
    #define phn puts("")
    #define LL long long
    #define il inline
    using namespace std;
    #define int LL
    int read();
    #define N 200010
    int n,m,p,q;
    const int mod=1e9+7;
    int a[N],f[N][12],g[N][12],C[15][15];
    int to[N<<1],fir[N<<1],head[N<<1],cnt;
    il int qpow(int x,int k){int s=1;for(;k;x=x*x%mod,k>>=1)if(k&1)s=s*x%mod;return s;}
    il void add(int x,int y){
        to[++cnt]=y;fir[cnt]=head[x];head[x]=cnt;
    }
    void dfs(int x,int fa){
        g[x][0]=1;f[x][0]=1;
        g[x][1]=p*a[x]%mod;f[x][1]=p*a[x]%mod;
        F(i,2,m){
            g[x][i]=g[x][i-1]*a[x]%mod;
            f[x][i]=f[x][i-1]*a[x]%mod;
        }
        for(int i=head[x];i;i=fir[i]){
            int v=to[i];
            if(v==fa)continue;
            dfs(v,x);
            for(int j=m;j>=1;--j){
                (f[x][j]+=f[v][j])%=mod;
                F(k,1,j-1){
                    (f[x][j]+=C[j][k]*g[x][k]%mod*g[v][j-k]%mod)%=mod;
                }
                //f[x][j]%=mod;
            }
            for(int j=m;j>=1;--j){
                (g[x][j]+=p*g[v][j])%=mod;
                F(k,1,j-1){
                    (g[x][j]+=C[j][k]*g[x][k]%mod*g[v][j-k]%mod)%=mod;
                }
                //g[x][j]%=mod;
            }
        }
    }
    signed main(){
        C[0][0]=1;
        F(i,1,12){
            C[i][0]=1;
            F(j,1,i)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
        }
        n=read();m=read();p=read();q=read();
        p=p*qpow(q,mod-2)%mod;
        int x,y;
        F(i,1,n)a[i]=read();
        F(i,2,n){
            x=read();y=read();add(x,y);add(y,x);
        }
        dfs(1,0);
        printf("%lld
    ",f[1][m]);
    }
    il int read(){
        int s=0;rg char ch;
        while(ch=getchar(),!isdigit(ch));
        for(;isdigit(ch);s=s*10+(ch^48),ch=getchar());
        return s;
    }
    /*
    g++ 1.cpp -g
    time ./a.out
    3 2 1 2
    1 2 4
    1 2
    1 3
    */
    View Code
    Informatik verbindet dich und mich. 信息将你我连结。
  • 相关阅读:
    final关键字
    海思NB-IOT的SDK看门狗的使用
    IAR环境下编译CC2640入门开发
    股票操作记录180613(2)
    股票操作笔记18年6月13(1)
    PyYAML学习第一篇
    片仔癀犯过的错误
    2018年5月份片仔癀最佳演员奖
    2018-05-22两只垃圾基金南方产业活力000955和鹏华全球高收益债券000290
    linux c编程:网络编程
  • 原文地址:https://www.cnblogs.com/seamtn/p/11465140.html
Copyright © 2020-2023  润新知