UpdateAfterEvent
10月3日,在杭州市西湖景区,一只小松鼠不停地接受一道道食物,花生、
玉米、饼干,可谓来者不拒,憨态可掬的模样吸引了众多围观者...
Description
小松鼠打了10个小时的游戏,一脸满足。却发现周围再次围满了游客,
逃!
她发现整个西湖内的松鼠都以相同的速度在树之间跳跃。每跳跃一次花
费一个单位的时间。我们可以把西湖抽象为一张n个点的无向图,初始时
每个点上都有若干只松鼠,它们每单位时间都可以沿着一条无向边进行跳
跃。
对于一只当前在点i的松鼠,它在接下来的一个单位时间内等概率向相邻
的点跳跃。更具体地讲,我们称与点i通过一条无向边直接相连的点为与i相
邻的点,假设这样的点有p个,那么对于每一个与i相邻的点,在下一时刻都
有 1/p 的概率跳到它。
超萌小松鼠已知初始时刻(0时刻)每棵树上的松鼠分布情况,她想知道
在T时刻,在同一棵树上的松鼠对数的期望。关于“松鼠对数”的解释:假
设有4只松鼠在同一棵树上,那么我们称有6对在同一棵树上的松鼠。
为了避免精度误差,我们将答案模10^9 + 7输出。
Input
第一行三个数n, T 。 意义如题面中所述。 接下来一行n个数, 第i个
数a i 表示第i个点初始时刻有a i 只松鼠。 接下来n行,每行n个数,第i行
第j个数如果为1表示点i与点j间有无向边相连,为0则表示没有。
Output
输出一行一个数,表示T时刻在同一棵树上的松鼠对数的期望在模10 9 +
7意义下的答案。6
Constraints
对于前30%,n <= 10, T <= 30
对于前50%,n <= 100, T <= 30
对于100%,n <= 100, T <= 10^9
题解:
大家能够发现,尽管可能大家最先想到的计算松鼠对数的方法,是根据树上的松鼠总数x,
通过x * (x - 1) / 2来得到。但不妨考虑一下一个更一般的方法:
枚举一只松鼠,再枚举另一只松鼠,如果它们在同一棵树上则答案加一。
从这个方法中能够得到的启示是:松鼠对数这个量实际上是相对独立的,即与这两只松鼠之外的量并无直接的关系。这样就避免了我们陷入一味考虑如何计算“松鼠期望总数”的错误方向了。
枚举一只松鼠A,再枚举另一只松鼠B,考虑它们同时存在在树i上的情况。
假设松鼠A在树i上的概率为P(A, i), 松鼠B在树i上的概率为P(B, i)
则它们同时存在于树i上的概率为P(A, i) * P(B, i)
而这一事件构成了“1对结束时在同一棵树上的松鼠”
因此对答案的贡献是 P(A, i) * P(B, i) * 1
我们只需要对于每一对松鼠枚举一下树i,然后对这些东西求和计入答案就可以了。
考虑如何计算P(A,i)。我们不妨假设f(i, j)为一只松鼠从点i出发,在点j停下的概率。
当T = 0时,f[i][i]均为1.0,每过一个单位时间时,考虑f[i][j]即松鼠当前在j时的概率
根据题中的描述向j的相邻点转移。
这样能够得到所有T <= 30的分数
观察可知,每次的转移事实上都是一样的。于是我们可以使用矩阵乘法来优化这个转移过程。
100分是给n^2计算期望的方法
首先
我们要求的是E(1)*E'(1)/2+E(1)*E(2).....+E(1)*E(n)+E(2)*E'(2)/2+E(2)*E(3)....
E'指的是少一个松鼠的期望
如果直接枚举终点和两端点,将是n^3
但可以这样:原式=[(E(1)+E(2)+E(3)+E(4).....)^2-E(1)(E(1)-E'(1))-E(2)(E(2)-E'(2))....]/2
显然E(1)-E'(1)=f[][]
枚举终点和一个端点就行了
题目中要求取模,要除的话直接模逆元
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Matrix
{
lol a[][];
}Mat,ans;
int Mod=;
lol n,T;
lol v[];
int map[][];
lol A[],f[][],anss;
Matrix operator *(const Matrix &x,const Matrix &y)
{
Matrix res;
int i,j,k;
memset(res.a,,sizeof(res.a));
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
{
for (k=;k<=n;k++)
{
res.a[i][j]+=(x.a[i][k]*y.a[k][j])%Mod;
res.a[i][j]%=Mod;
}
}
}
return res;
}
void pow(int x)
{int i;
for (i=;i<=n;i++)
ans.a[i][i]=;
while (x)
{
if (x&) ans=ans*Mat;
Mat=Mat*Mat;
x/=;
}
}
int main()
{int i,j;
cin>>n>>T;
for (i=;i<=n;i++)
{
scanf("%lld",&v[i]);
}
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
}
A[]=;
for (i=;i<=;i++)
A[i]=((Mod-Mod/i)*A[Mod%i])%Mod;
memset(Mat.a,,sizeof(Mat.a));
for (i=;i<=n;i++)
{
int cnt=;
for (j=;j<=n;j++)
if (map[i][j]) cnt++;
for (j=;j<=n;j++)
if (map[i][j]) Mat.a[i][j]=A[cnt];
}
if (T>)
pow(T);
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
f[i][j]=ans.a[i][j];
}
if (T==)
for (i=;i<=n;i++)
for (j=;j<=n;j++)
f[i][j]=Mat.a[i][j];
for (i=;i<=n;i++)
{
lol ret1=,ret2=,ret3;
for (j=;j<=n;j++)
{
lol tmp=(f[j][i]*v[j])%Mod;
ret1=(ret1+tmp)%Mod;
ret2=(ret2+tmp*f[j][i])%Mod;
}
ret3=((ret1*ret1)%Mod-ret2+Mod)%Mod;
anss+=(ret3*A[])%Mod;
anss%=Mod;
}
cout<<anss;
}
UpdateAfterEvent的更多相关文章
- as3 updateAfterEvent的作用
flash中一共有三个类具有该属性,这三个类分别是:KeyboardEvent,MouseEvent,TimerEvent.调用updateAfterEvent 属性的事件,可强制立即执行呈现操作,而 ...
- JavaScript浮动广告代码,容纯DIV/CSS对联漂浮广告代码,兼容性非常好的js右下角与漂浮广告代码
基于JavaScript代码实现随机漂浮图片广告,javascript图片广告 在网上有很多这样的代码,不过未必符合W3C标准,因为在头部加上<!DOCTYPE html>类似标签之后,漂 ...
- [AS3]as3画笔实例实现橡皮擦功能源代码
[AS3]as3画笔实例实现橡皮擦功能源代码 //主容器 var main:Sprite = new Sprite(); main.mouseEnabled = false; addChild(mai ...
- Flash AS实现时钟效果(全脚本实现)
最近工作中用到个Flash效果,好久没有写FlashAS脚本了,就想从以前写的代码中找一些实例.竟然看到硬盘中还留有若干年前的代码. 这个时钟效果是全部采用脚本实现,图形也是用脚本绘制的.写于2005 ...
- Adobe Scout 使用参考说明
Adobe Scout 用于优化 Flash 内容,是一款极为强大的工具,因为它能让您看到 Flash Player 幕后正在发生的事情.但是若明白 Flash Player 为什么做这些事情,您看到 ...
- Adobe Scout 入门
http://www.adobe.com/cn/devnet/scout/articles/adobe-scout-getting-started.html Adobe Scout 是新一代 Flas ...
- as3.0画直线
import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.Point; var line:Shape; ...
- JavaScript中的setInterval用法
setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数据库的变量或更新时间显示.setInterval动作的语法格式如下:setInterval ...
- as3.0橡皮擦功能
//主容器 var main:Sprite = new Sprite(); main.mouseEnabled = false; addChild(main) //临时容器(所有操作都将先画在临时容器 ...
随机推荐
- 记录python接口自动化测试--unittest框架基本应用(第二目)
在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...
- 2017年秋软工-领跑衫获奖感言&我最感谢的人
啥都不说,先上幅图.获得领跑衫,开心. 一.回忆 这是我第二次来上恩师杨的软件工程,第一次是2016年春,那时候我还是本科三年级的学生.忘了第一次为啥去蹭课,印象中是我的榜样亮哥把我给忽悠过去的?我也 ...
- 算法——算法时间复杂度的计算和大O阶的推导
在算法分析中,我们将语句总的执行次数记为T(n)进而分析T(n)随n的变化情况确认T(n)的数量级.一般情况下,T(n)随n增大变化最缓慢的算法为最优算法. 根据定义,T(n)的求法是很简单的,也就是 ...
- 去掉xcode编译warning:ld: warning: directory not found for option '-L
选择工程, 编译的 (targets) 选择 Build Settings 菜单 查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warn ...
- 项目Beta冲刺Day2
项目进展 李明皇 今天解决的进度 优化了信息详情页的布局:日期显示,添加举报按钮等 优化了程序的数据传递逻辑 明天安排 程序运行逻辑的完善 林翔 今天解决的进度 实现微信端消息发布的插入数据库 明天安 ...
- 201421123042 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 答: 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计 ...
- Flask 学习 八 用户角色
角色在数据库中表示 app/models.py class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primar ...
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 剑指offer-两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路 分析可得如果两个链表有公共节点,那么公共节点出现在两个链表的尾部,即从某一节点开始,两链表之后的节点全部相等.可以首先遍历两个链表得出各自 ...
- RESTful API 编写指南
基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的 ...