当前位置: 首页 > news >正文

BZOJ5091: [Lydsy1711月赛]摘苹果【期望DP】

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}\)表示在第j步走到i点的概率

\(f_{i,0}=\frac{d_i}{2m}\)

那么\(f_{i,1}=\sum_{i,j\in E}\frac{f_{j,0}}{d_j}=\frac{d_i}{2m}\)

所以得到\(f_{i,j\in[0,k]}=\frac{d_i}{2m}\)

然后又因为每个树的贡献是\(a_i*\sum_{i=1}^kf_{i,k}=\frac{a_i*d_i*k}{2m}\)

然后就直接算就行了


#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;
const int Mod = 1e9 + 7;

int add(int a, int b) {
  return (a += b) >= Mod ? a - Mod : a;
}

int mul(int a, int b) {
  return 1ll * a * b % Mod;
}

int fast_pow(int a, int b) {
  int res = 1;
  while (b) {
    if (b & 1) res = mul(res, a);
    b >>= 1;
    a = mul(a, a); 
  }
  return res;
}

int n, m, k, d[N], a[N];

int main() {
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= m; i++) {
    int u, v; scanf("%d %d", &u, &v);
    d[u]++;
    d[v]++;
  }
  int cur = 0;
  for (int i = 1; i <= n; i++) {
    cur = add(cur, mul(a[i], d[i]));
  }
  printf("%d", mul(cur, mul(k, fast_pow(m * 2, Mod - 2))));
  return 0;
}

转载于:https://www.cnblogs.com/dream-maker-yk/p/10078969.html

相关文章:

  • RDIFramework.NET V3.3 Web版新增报表管理功能模块-重量级实用功能
  • /etc/skel 目录作用
  • [逆向工程] 二进制拆弹Binary Bombs 快乐拆弹 详解
  • 软工 · BETA 版冲刺前准备(团队)
  • [源码和文档分享]基于C语言的PL0编译器
  • 图-连通性-有向图的强连通分量
  • 第四次作业
  • 简单的课程管理系统
  • 钉钉:自定义机器人
  • CF161D Distance in Tree
  • python1210作业
  • 7 练习1 -作业讲解
  • 并发编程
  • Vscode的使用
  • VS2015调用Matlab2017a环境配置(转载)
  • 2017-08-04 前端日报
  • javascript面向对象之创建对象
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Meteor的表单提交:Form
  • PaddlePaddle-GitHub的正确打开姿势
  • QQ浏览器x5内核的兼容性问题
  • sessionStorage和localStorage
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 创建一个Struts2项目maven 方式
  • 坑!为什么View.startAnimation不起作用?
  • 码农张的Bug人生 - 见面之礼
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 推荐一个React的管理后台框架
  • 微信小程序--------语音识别(前端自己也能玩)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​Spring Boot 分片上传文件
  • ###STL(标准模板库)
  • #include
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma once
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (k8s中)docker netty OOM问题记录
  • (六)软件测试分工
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十六)Flask之蓝图
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)程序员疫苗:代码注入
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 事件模型教程(二)
  • .NET 依赖注入和配置系统
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • @javax.ws.rs Webservice注解
  • [2669]2-2 Time类的定义
  • [Angular] 笔记 18:Angular Router
  • [C puzzle book] types
  • [CSS]盒子模型