• 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;
    }
    

      

  • 相关阅读:
    #Linux 系统管理命令 | top命令
    Linux 操作文件目录
    背包问题(1)背包的引入
    硬币找零问题
    输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
    张小二求职记之 单例模式(三)之决战多线程
    张小二求职 之单例模式(一)
    张小二求职记之 单例模式(二)
    待修改 nyoj 412 又是一个遗留问题
    nyoj 904 hashmap
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8631127.html
Copyright © 2020-2023  润新知