zoukankan      html  css  js  c++  java
  • bzoj 5091: [Lydsy0711月赛]摘苹果

    5091: [Lydsy0711月赛]摘苹果

    Time Limit: 1 Sec  Memory Limit: 256 MB
    Submit: 148  Solved: 114
    [Submit][Status][Discuss]

    Description

    小Q的工作是采摘花园里的苹果。在花园中有n棵苹果树以及m条双向道路,苹果树编号依次为1到n,每条道路的两
    端连接着两棵不同的苹果树。假设第i棵苹果树连接着d_i条道路。小Q将会按照以下方式去采摘苹果:
     
    1.小Q随机移动到一棵苹果树下,移动到第i棵苹果树下的概率为d_i/(2m),但不在此采摘。
     
    2.等概率随机选择一条与当前苹果树相连的一条道路,移动到另一棵苹果树下。
     
    3.假设当前位于第i棵苹果树下,则他会采摘a_i个苹果,多次经过同一棵苹果树下会重复采摘。
     
    4.重复第2和3步k次。
     
    请写一个程序帮助计算小Q期望摘到多少苹果。
     

    Input

    第一行包含三个正整数n,m,k(n,k<=100000,m<=200000),分别表示苹果树和道路的数量以及重复步骤的次数。

    第二行包含n个正整数,依次表示a_1,a_2,...,a_n(1<=a_i<=100)。
    接下来m行,每行两个正整数u,v(1<=u,v<=n,u!=v),表示第u和第v棵苹果树之间存在一条道路。
     
     

    Output

     若答案为P/Q,则输出一行一个整数,即P*Q^{-1} mod 1000000007(10^9+7)。

     

    Sample Input

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

    Sample Output

    750000011
    //期望为5.75=23/4=(23*250000002) mod 1000000007=750000011。
     
     
        让我们设f[i][j]为走了i次之后到j的概率。
        显然 f[0][j] = d[j]/2m 。
        然后答案就是ΣΣf[i][j] * a[j]
     
        但其实不管i是多少,f[i][j] 都等于 d[j]/2m ,接下来我来证明这一点。
     
        因为f[0][j] 等于 d[j]/2m ,所以我们第一次走上每条边(考虑方向的话是有2m条边的)的概率都是1/2m,
        所以每个点被走到的概率就是d[j]/2m,也就是f[1][j] = f[0][j] 。
         
        然后就证出来了2333
     
     
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=200005;
    const int ha=1000000007;
    int inv,n,m,ans;
    int k,d[maxn],a[maxn];
    
    inline int add(int x,int y){
    	x+=y;
    	return x>=ha?x-ha:x;
    }
    
    inline int ksm(int x,int y){
    	int an=1;
    	for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
    	return an;
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        int uu,vv; 
    	inv=ksm(2*m,ha-2);
    	for(int i=1;i<=n;i++) scanf("%d",a+i);
        for(int i=1;i<=m;i++){
        	scanf("%d%d",&uu,&vv);
        	d[uu]++,d[vv]++;
        }
        for(int i=1;i<=n;i++) ans=add(ans,a[i]*d[i]*(ll)inv%ha);
        ans=ans*(ll)k%ha;
        printf("%d
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8631127.html
Copyright © 2011-2022 走看看