这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残

这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行)再想交的时候已经开始hack了

真是TMD。。。。。。。,然后rejudge完了之后再HDOJ上瞬间AC,真是。。。狗了,只能是自己手残

手残,手残,手残(重要的事情说三遍)

思路 :(杭电官方题解,我就不班门弄斧了。。QAQ)

考虑dpdp,用f_{t,x}f​t,x​​表示第tt秒在xx的概率,初始时f_{0,u}=1f​0,u​​=1.

f_{t+1,y}=\sum_{x,x->y}{\frac{f_{t,x}}{Out_x}},Out_xf​t+1,y​​=∑​x,x−>y​​​Out​x​​​​f​t,x​​​​,Out​x​​表示xx的出度.

因为tt很大,而且发现每次的转移都是相同的,所以直接矩乘就好了.

复杂度是O(QN^3\log t)O(QN​3​​logt).

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstdlib>
  8. #include<vector>
  9. #include<queue>
  10. using namespace std;
  11. typedef long long LL;
  12. const int maxn=+;
  13. const LL mod=1e9+;
  14. vector<int>g[maxn];
  15. int n,m;
  16. LL xx[maxn][maxn],yy[maxn][maxn];
  17. struct mat
  18. {
  19. LL x[maxn][maxn],y[maxn][maxn];
  20. } o,res;
  21. mat mul(mat a,mat b)
  22. {
  23. mat temp;
  24. for(int i=; i<=n; ++i)
  25. for(int j=; j<=n; ++j)
  26. {
  27. temp.x[i][j]=;
  28. temp.y[i][j]=;
  29. for(int k=; k<=n; ++k)
  30. {
  31. LL t1=a.x[i][k]*b.x[k][j]%mod;
  32. LL t2=a.y[i][k]*b.y[k][j]%mod;
  33. temp.x[i][j]=(temp.x[i][j]*t2%mod+temp.y[i][j]*t1%mod)%mod;
  34. temp.y[i][j]=(temp.y[i][j]*t2)%mod;
  35. }
  36. }
  37. return temp;
  38. }
  39. void cal(int c)
  40. {
  41. for(int i=; i<=n; ++i)
  42. for(int j=; j<=n; ++j)
  43. {
  44. o.x[i][j]=xx[i][j];
  45. o.y[i][j]=yy[i][j];
  46. res.x[i][j]=,res.y[i][j]=;
  47. }
  48. for(int i=; i<=n; ++i)
  49. res.x[i][i]=;
  50. while(c)
  51. {
  52. if(c&)
  53. res=mul(res,o);
  54. c>>=;
  55. o=mul(o,o);
  56. }
  57. }
  58. LL getans(LL x,LL y)
  59. {
  60. int c=1e9+;
  61. LL r=;
  62. while(c)
  63. {
  64. if(c&)
  65. r=(r*y)%mod;
  66. c>>=;
  67. y=(y*y)%mod;
  68. }
  69. r=(x%mod*r%mod);
  70. return r;
  71. }
  72. int main()
  73. {
  74. while(~scanf("%d%d",&n,&m))
  75. {
  76. memset(xx,,sizeof(xx));
  77. for(int i=; i<=n; i++)
  78. for(int j=; j<=n; j++)
  79. yy[i][j]=;
  80. for(int i=; i<=n; ++i)
  81. g[i].clear();
  82. for(int i=; i<m; ++i)
  83. {
  84. int u,v;
  85. scanf("%d%d",&u,&v);
  86. g[u].push_back(v);
  87. }
  88. for(int i=; i<=n; ++i)
  89. {
  90. for(int j=; j<g[i].size(); ++j)
  91. xx[i][g[i][j]]=,yy[i][g[i][j]]=g[i].size();
  92. }
  93. int q;
  94. scanf("%d",&q);
  95. while(q--)
  96. {
  97. int u,k;
  98. scanf("%d%d",&u,&k);
  99. cal(k);
  100. for(int i=; i<=n; i++)
  101. printf("%I64d ",getans(res.x[u][i],res.y[u][i]));
  102. printf("\n");
  103. }
  104. }
  105. return ;
  106. }

HDU 5607 graph 矩阵快速幂 + 快速幂的更多相关文章

  1. hdu 5607 graph (矩阵乘法快速幂)

    考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...

  2. HDU 5607 graph(矩阵优化+概率DP)

    该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...

  3. HDU 5607 graph(DP+矩阵乘法)

    [题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...

  4. HDU 5607 graph(矩阵乘法)

    题意 在一个 \(n\) 个节点 \(m\) 条边的有向图上随机游走,有 \(Q\) 个询问,每次给定一个起点 \(u\) 和步数 \(K\) ,每次回答最后停在每个节点的概率. \(1 \leq n ...

  5. HDU.2640 Queuing (矩阵快速幂)

    HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...

  6. HDU 5667 构造矩阵快速幂

    HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...

  7. HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  8. hdu 5690 2016"百度之星" - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k ...

  9. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

随机推荐

  1. C# Windows - ListBox&CheckedListBox

    ListBox和CheckedListBox类的属性 属性 说明 SelectedIndex 这个值表明列表框中选中项的基于0的索引 ColumnWidth 在包含多个列的列表框中,这个属性指定列宽 ...

  2. NOSQL Mongo入门学习笔记 - C++连接Mongodb(三)

    OS环境: Centos 7.1 release X86_64 编译环境: G++ 4.8.3 已经成功搭建好了Mongodb,也初步在命令行中的查询与写入数据的基本方法,现在通过C++来连接Mong ...

  3. 安装oracle 11g详细过程仅供参考

  4. JS日期格式化(网上转载)

    JS日期格式化(网上转载) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <ht ...

  5. firefly的环境搭建(2013年9月25日最新,win下最详图文)

    源地址:http://www.9miao.com/question-15-53785.html 一.安装PythonFirefly是采用Python编写的高性能.分布式游戏服务器框架,所以使用Fire ...

  6. MonoBehaviour的事件和具体功能总结

    原地址:http://blog.csdn.net/dingxiaowei2013/article/details/26215577 苦于Visual Studio 2013没有对MonoBehavio ...

  7. struts2总结五: Strut2 访问Servlet API

    一.间接访问 public String execute() throws Exception { this.message="hello,this is put into applicat ...

  8. 在自己的网站上实现QQ授权登录

    最近在实现QQ授权登录,现将我的实现过程以及我的理解整理如下.以下所述如有不对之处,请指正. 官方提供的SDK有:JS,PHP,Java.我的网站使用Scala+Play搭建的,所以只能用JS SDk ...

  9. Maven中聚合与继承

    何为继承? --›继承为了消除重复,我们把很多相同的配置提取出来 --›例如:grouptId,version等 就像写java程序一样,对于有共性切重复的东西,就提取出来. 如有三个pom.xml配 ...

  10. Winform 数据验证

    http://blog.scosby.com/post/2010/02/11/Validation-in-Windows-Forms.aspx 总结:1. CancelEventArgs e ,调用e ...