题解:

不错的题目

首先要求的黑点个数非常多

比较容易想到矩阵乘法

于是我们可以求出从某个黑点出发到任意一个黑点之间的概率

发现不同出发点带来的变化只有常数项

于是我们可以预处理出从每个方程转移的系数

处理的方法就是 当行a减去k倍的行b时

我们同时更新行b被多少行更新了

求完之后我们只需要求它的k-2次幂

当然我们还需要求出起点1到每个黑点的概率(一起求)

矩阵乘法的比较优的写法是这样的

  1. rep(i,,n)
  2. rep(j,,n)
  3. if (x.a[j][i])
  4. rep(k,,n)
  5. z.a[j][k]+=x.a[j][i]*y.a[i][k];

要再快可以使用分块乘法

高斯消元的时候由于f[i][i]=1,所以可以不去找最大值

因为那样的话我们处理哪些由哪些转移还要记录pos,比较麻烦

cf还卡栈。。快速幂要写成非递归形式的

代码:

  1. #include <bits/stdc++.h>
  2. #define rint register int
  3. #define IL inline
  4. #define rep(i,h,t) for (rint i=h;i<=t;i++)
  5. #define dep(i,t,h) for (rint i=t;i>=h;i--)
  6. using namespace std;
  7. const int N=6e5;
  8. const int N2=;
  9. int head[N2],v[N2],du[N2],l,n,m,k,M[N2][N2];
  10. double o2[N2];
  11. double f[N2][N2],jl[N2][N2];
  12. double ee=1.00000000000000000;
  13. struct re{
  14. int a,b;
  15. }a[N*];
  16. void arr(int x,int y)
  17. {
  18. a[++l].a=head[x];
  19. a[l].b=y;
  20. head[x]=l;
  21. }
  22. struct re1{
  23. double a[][];
  24. re1()
  25. {
  26. rep(i,,n)
  27. rep(j,,n) a[i][j]=;
  28. }
  29. }o;
  30. re1 z;
  31. re1 js(re1 x,re1 y)
  32. {
  33. memset(z.a,,sizeof(z.a));
  34. rep(i,,n)
  35. rep(j,,n)
  36. if (x.a[i][j])
  37. rep(k,,n)
  38. z.a[i][k]+=x.a[i][j]*y.a[j][k];
  39. return(z);
  40. }
  41. re1 y;
  42. re1 o3;
  43. re1 fsp(rint x)
  44. {
  45. memset(y.a,,sizeof(y.a));
  46. o3=o;
  47. rep(i,,n) y.a[i][i]=;
  48. while (x)
  49. {
  50. if (x&) y=js(y,o3);
  51. x>>=;
  52. o3=js(o3,o3);
  53. }
  54. return(y);
  55. }
  56. int ve[N2],cnt=;
  57. void Gauss()
  58. {
  59. rep(i,,n) jl[i][i]=;
  60. rep(i,,n)
  61. {
  62. rep(j,,n)
  63. if (i!=j)
  64. {
  65. double t=-f[j][i]/f[i][i];
  66. rep(k,,n) f[j][k]+=t*f[i][k];
  67. rep(k,,n) jl[j][k]+=t*jl[i][k];
  68. }
  69. }
  70. rep(i,,n)
  71. if (v[i])
  72. {
  73. cnt=;
  74. double tmp=ee/du[i];
  75. rep(j,,n)
  76. if (M[i][j]) ve[++cnt]=j;
  77. rep(k,,n)
  78. if (v[k])
  79. {
  80. double ans=;
  81. rep(j,,cnt) ans+=M[i][ve[j]]*jl[k][ve[j]]*tmp;
  82. o.a[i][k]=ans;
  83. }
  84. }
  85. rep(j,,n)
  86. if (v[j])
  87. o2[j]=jl[j][];
  88. }
  89. int main()
  90. {
  91. freopen("1.in","r",stdin);
  92. freopen("1.out","w",stdout);
  93. ios::sync_with_stdio(false);
  94. cin>>n>>m>>k;
  95. rep(i,,n)
  96. {
  97. cin>>v[i];
  98. }
  99. rep(i,,m)
  100. {
  101. int x,y;
  102. cin>>x>>y;
  103. arr(x,y); arr(y,x);
  104. M[x][y]++; M[y][x]++;
  105. du[x]++; du[y]++;
  106. }
  107. rep(i,,n)
  108. {
  109. f[i][i]=-;
  110. for (int u=head[i];u;u=a[u].a)
  111. {
  112. int vv=a[u].b;
  113. if (!v[vv]) f[i][vv]+=ee/du[vv];
  114. }
  115. }
  116. Gauss();
  117. double ans=;
  118. if (k!=)
  119. {
  120. re1 ans2=fsp(k-);
  121. rep(i,,n)
  122. if (v[i]) ans+=o2[i]*ans2.a[i][n];
  123. } else
  124. if (k==) ans=o2[n];
  125. else ans=;
  126. printf("%.9f",ans);
  127. return ;
  128. }

【CF446D】DZY Loves Games的更多相关文章

  1. 【CF446D】DZY Loves Games 高斯消元+矩阵乘法

    [CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...

  2. 【BZOJ3561】DZY Loves Math VI (数论)

    [BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...

  3. 【BZOJ3309】DZY Loves Math(莫比乌斯反演)

    [BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...

  4. 【BZOJ3512】DZY Loves Math IV(杜教筛)

    [BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...

  5. 【BZOJ3309】DZY Loves Math 解题报告

    [BZOJ3309]DZY Loves Math Description 对于正整数\(n\),定义\(f(n)\)为\(n\)所含质因子的最大幂指数.例如\(f(1960)=f(2^3×5^1×7^ ...

  6. 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)

    [BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...

  7. 【题解】DZY Loves Chinese

    [题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...

  8. 【BZOJ3569】DZY Loves Chinese II

    [BZOJ3569]DZY Loves Chinese II 题面 bzoj 题目大意: 给你一张\(N(1\leq N\leq 10^5)\)个点\(M(1\leq M\leq 5\times 10 ...

  9. 【BZOJ3309】DZY Loves Math

    Time Limit: 5000 ms Memory Limit: 512 MB Description ​ 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * ...

随机推荐

  1. 阿里云服务器上通过Docker部署redmine

    背景:在日常工作的过程中会遇到各种各样的问题,每个问题来了之后需要花时间解决.这里就面临两个问题. 1:问题责任不明确,有时候会遇到数据库或者物理服务器的问题,这时候就需要把相应问题指派给相应的人,传 ...

  2. Android Day2

    紧接前一篇日记: 2.增加文本域 在<LinearLayout>中增加<EditText>元素,无格式设置的时候如下. <EditText android:id=&quo ...

  3. ES--02

    第十一讲: 2个node环境下replica shard 是如何分配的 1)replica shard分配:3个primary shard,3个replica shard,1 node(2)prima ...

  4. python操作三大主流数据库(13)python操作redis之新闻项目实战①新闻数据的导入

    1.新闻处理页面redis_news.py #coding:utf-8 import math import redis class RedisNews(object): def __init__(s ...

  5. jqueryui组件progressbar进度条和日期组件datepickers的简单使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Lua学习总结

    由于一些工作上的需要,开始对Lua的学习.之前有JavaScript的基础,而且两者都是脚本语言,所以本总结旨在列出与JavaScript不同的地方,方便后续的回顾和学习.下面进入正题吧! 1.注释 ...

  7. Tomcat 部署项目的三种方法(转)

    转自:https://www.cnblogs.com/ysocean/p/6893446.html#_label0 1.下载 Tomcat 服务器 ①.官网下载地址:http://tomcat.apa ...

  8. 【原创】大数据基础之Hadoop(2)hdfs和yarn最简绿色部署

    环境:3结点集群 192.168.0.1192.168.0.2192.168.0.3 1 配置root用户服务期间免密登录 参考:https://www.cnblogs.com/barneywill/ ...

  9. boolalpha的作用

    #include <iostream>using namespace std;int main(){        bool b=true;        cout << &q ...

  10. 基础常用的数据结构 Collection Map

    map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map ...