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[][]

枚举终点和一个端点就行了

题目中要求取模,要除的话直接模逆元

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long lol;
  7. struct Matrix
  8. {
  9. lol a[][];
  10. }Mat,ans;
  11. int Mod=;
  12. lol n,T;
  13. lol v[];
  14. int map[][];
  15. lol A[],f[][],anss;
  16. Matrix operator *(const Matrix &x,const Matrix &y)
  17. {
  18. Matrix res;
  19. int i,j,k;
  20. memset(res.a,,sizeof(res.a));
  21. for (i=;i<=n;i++)
  22. {
  23. for (j=;j<=n;j++)
  24. {
  25. for (k=;k<=n;k++)
  26. {
  27. res.a[i][j]+=(x.a[i][k]*y.a[k][j])%Mod;
  28. res.a[i][j]%=Mod;
  29. }
  30. }
  31. }
  32. return res;
  33. }
  34. void pow(int x)
  35. {int i;
  36. for (i=;i<=n;i++)
  37. ans.a[i][i]=;
  38. while (x)
  39. {
  40. if (x&) ans=ans*Mat;
  41. Mat=Mat*Mat;
  42. x/=;
  43. }
  44. }
  45. int main()
  46. {int i,j;
  47. cin>>n>>T;
  48. for (i=;i<=n;i++)
  49. {
  50. scanf("%lld",&v[i]);
  51. }
  52. for (i=;i<=n;i++)
  53. {
  54. for (j=;j<=n;j++)
  55. {
  56. scanf("%d",&map[i][j]);
  57. }
  58. }
  59. A[]=;
  60. for (i=;i<=;i++)
  61. A[i]=((Mod-Mod/i)*A[Mod%i])%Mod;
  62. memset(Mat.a,,sizeof(Mat.a));
  63. for (i=;i<=n;i++)
  64. {
  65. int cnt=;
  66. for (j=;j<=n;j++)
  67. if (map[i][j]) cnt++;
  68. for (j=;j<=n;j++)
  69. if (map[i][j]) Mat.a[i][j]=A[cnt];
  70. }
  71. if (T>)
  72. pow(T);
  73. for (i=;i<=n;i++)
  74. {
  75. for (j=;j<=n;j++)
  76. f[i][j]=ans.a[i][j];
  77. }
  78. if (T==)
  79. for (i=;i<=n;i++)
  80. for (j=;j<=n;j++)
  81. f[i][j]=Mat.a[i][j];
  82. for (i=;i<=n;i++)
  83. {
  84. lol ret1=,ret2=,ret3;
  85. for (j=;j<=n;j++)
  86. {
  87. lol tmp=(f[j][i]*v[j])%Mod;
  88. ret1=(ret1+tmp)%Mod;
  89. ret2=(ret2+tmp*f[j][i])%Mod;
  90. }
  91. ret3=((ret1*ret1)%Mod-ret2+Mod)%Mod;
  92. anss+=(ret3*A[])%Mod;
  93. anss%=Mod;
  94. }
  95. cout<<anss;
  96. }

UpdateAfterEvent的更多相关文章

  1. as3 updateAfterEvent的作用

    flash中一共有三个类具有该属性,这三个类分别是:KeyboardEvent,MouseEvent,TimerEvent.调用updateAfterEvent 属性的事件,可强制立即执行呈现操作,而 ...

  2. JavaScript浮动广告代码,容纯DIV/CSS对联漂浮广告代码,兼容性非常好的js右下角与漂浮广告代码

    基于JavaScript代码实现随机漂浮图片广告,javascript图片广告 在网上有很多这样的代码,不过未必符合W3C标准,因为在头部加上<!DOCTYPE html>类似标签之后,漂 ...

  3. [AS3]as3画笔实例实现橡皮擦功能源代码

    [AS3]as3画笔实例实现橡皮擦功能源代码 //主容器 var main:Sprite = new Sprite(); main.mouseEnabled = false; addChild(mai ...

  4. Flash AS实现时钟效果(全脚本实现)

    最近工作中用到个Flash效果,好久没有写FlashAS脚本了,就想从以前写的代码中找一些实例.竟然看到硬盘中还留有若干年前的代码. 这个时钟效果是全部采用脚本实现,图形也是用脚本绘制的.写于2005 ...

  5. Adobe Scout 使用参考说明

    Adobe Scout 用于优化 Flash 内容,是一款极为强大的工具,因为它能让您看到 Flash Player 幕后正在发生的事情.但是若明白 Flash Player 为什么做这些事情,您看到 ...

  6. Adobe Scout 入门

    http://www.adobe.com/cn/devnet/scout/articles/adobe-scout-getting-started.html Adobe Scout 是新一代 Flas ...

  7. as3.0画直线

    import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.Point; var line:Shape; ...

  8. JavaScript中的setInterval用法

    setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数据库的变量或更新时间显示.setInterval动作的语法格式如下:setInterval ...

  9. as3.0橡皮擦功能

    //主容器 var main:Sprite = new Sprite(); main.mouseEnabled = false; addChild(main) //临时容器(所有操作都将先画在临时容器 ...

随机推荐

  1. Beta冲刺链接总汇

    Beta冲刺 咸鱼 Beta 冲刺day1 Beta 冲刺day2 Beta 冲刺day3 Beta 冲刺day4 Beta 冲刺day5 Beta 冲刺day6 Beta 冲刺day7 凡事预则立- ...

  2. 事后诸葛亮——城市安全风险管理项目Postmortem结果

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 本系统希望实现快速识别危害因素,使工作人员对风险作出准确的评估.即让使用者熟悉潜在的危险因素,知道 ...

  3. Django 测试驱动开发

    第一章 1.编写functional_tests.py from selenium import webdriver browser = webdriver.Firefox() browser.get ...

  4. 释义Oracle 11r2中并行执行相关参数

    因最近对现场某些服务器进行诊断和调整,用到了这类参数,因此对这类参数做了详尽的查阅和研究,现将该类参数释义如下,以方便同行和自己参考,禁止转载: 1.PARALLEL_ADAPTIVE_MULTI_U ...

  5. 基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...

  6. New UWP Community Toolkit - DeveloperTools

    概述 UWP Community Toolkit  中有一个开发者工具集 DeveloperTools,可以帮助开发者在开发过程中进行 UI 和功能的调试,本篇我们结合代码详细讲解  Develope ...

  7. c# 字符串的内存分配和驻留池( 转 )

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...

  8. HTTP协议的消息头:Content-Type和Accept的作用

    一.背景知识 1.概述 Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头 Acc ...

  9. docker实践3

    我的docker学习笔记3   $docker run ubuntu echo'hello world' $docker run -i -t ubuntu /bin/bash #ps -ef #exi ...

  10. zuul入门(3)开发zuul的过滤器

    1.编写Zuul过滤器(Java&Groovy) 理解过滤器类型和请求生命周期后,我们来编写一个Zuul过滤器.编写Zuul的过滤器非常简单,我们只需继承抽象类ZuulFilter,然后实现几 ...