矩阵快速幂。

构造一个矩阵,$a[i][j]$表示一次操作后,$j$会从$i$那里得到水的比例。注意$k=0$的时候,要将$a[i][j]$置为$1$。

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<stack>
  11. #include<ctime>
  12. #include<iostream>
  13. using namespace std;
  14. typedef long long LL;
  15. const double pi=acos(-1.0);
  16. void File()
  17. {
  18. freopen("D:\\in.txt","r",stdin);
  19. freopen("D:\\out.txt","w",stdout);
  20. }
  21. template <class T>
  22. inline void read(T &x)
  23. {
  24. char c = getchar();
  25. x = ;
  26. while(!isdigit(c)) c = getchar();
  27. while(isdigit(c))
  28. {
  29. x = x * + c - '';
  30. c = getchar();
  31. }
  32. }
  33.  
  34. struct Matrix
  35. {
  36. double A[][];
  37. int R, C;
  38. Matrix operator*(Matrix b);
  39. };
  40.  
  41. Matrix X, Y, Z;
  42.  
  43. int T,n,p;
  44.  
  45. Matrix Matrix::operator*(Matrix b)
  46. {
  47. Matrix c;
  48. memset(c.A, , sizeof(c.A));
  49. int i, j, k;
  50. for (i = ; i <= R; i++)
  51. for (j = ; j <= b.C; j++)
  52. for (k = ; k <= C; k++)
  53. c.A[i][j] = c.A[i][j] + A[i][k] * b.A[k][j];
  54. c.R = R; c.C = b.C;
  55. return c;
  56. }
  57.  
  58. void init()
  59. {
  60. Y.R = n; Y.C = n;
  61. for (int i = ; i <= n; i++) Y.A[i][i] = ;
  62. X.R = n; X.C = n;
  63. Z.R = ; Z.C = n;
  64. }
  65.  
  66. void work()
  67. {
  68. while (p)
  69. {
  70. if (p % == ) Y = Y*X;
  71. p = p >> ;
  72. X = X*X;
  73. }
  74. Z = Z*Y;
  75. }
  76.  
  77. int main()
  78. {
  79. scanf("%d",&T);
  80. while(T--)
  81. {
  82. scanf("%d",&n);
  83.  
  84. memset(X.A, , sizeof X.A);
  85. memset(Y.A, , sizeof Y.A);
  86. memset(Z.A, , sizeof Z.A);
  87.  
  88. for(int i=;i<=n;i++) scanf("%lf",&Z.A[][i]);
  89.  
  90. for(int i=;i<=n;i++)
  91. {
  92. int K; scanf("%d",&K);
  93. for(int j=;j<=K;j++)
  94. {
  95. int id; scanf("%d",&id);
  96. X.A[i][id]=1.0/K;
  97. }
  98. if(K==)
  99. {
  100. X.A[i][i]=1.0;
  101. }
  102. }
  103.  
  104. scanf("%d",&p);
  105.  
  106. init();
  107. work();
  108.  
  109. for(int i=;i<=n;i++)
  110. {
  111. printf("%.2f",Z.A[][i]);
  112. if(i<n) printf(" "); else printf("\n");
  113. }
  114. }
  115. return ;
  116. }

ZOJ 2974 Just Pour the Water的更多相关文章

  1. zoj 2974 Just Pour the Water矩阵快速幂

    Just Pour the Water Time Limit: 2 Seconds      Memory Limit: 65536 KB Shirly is a very clever girl. ...

  2. zoj 2974 Just Pour the Water (矩阵快速幂,简单)

    题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...

  3. ZOJ 2794 Just Pour the Water 【矩阵快速幂】

    给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M  ...

  4. ZOJ 2974 矩阵快速幂

    题意 给出n个杯子与初始其中有多少水 “同时”进行如下指令 将其中的水同时分入所指定的杯子 进行x次后 输出杯子剩余水量 队友想出应该是一道快速幂 但并不是过去的用初始杯子的水组成的矩阵乘某个矩阵 可 ...

  5. bnuoj 16493 Just Pour the Water(矩阵快速幂)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16493 [题解]:矩阵快速幂 [code]: #include <cstdlib> #i ...

  6. ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

    题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...

  7. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  8. Codeforces Round #311 (Div. 2)B. Pasha and Tea 水题

    B. Pasha and Tea Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/prob ...

  9. Codeforces gym 100685 C. Cinderella 水题

    C. CinderellaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/C ...

随机推荐

  1. UVA 11105 Semi-prime H-numbers

    https://vjudge.net/problem/UVA-11105 筛法 #include<cstdio> #include<cstring> #define N 100 ...

  2. vijos 1471 线性DP+贪心

    描述 Orz教主的成员为教主建了一个游乐场,在教主的规划下,游乐场有一排n个弹性无敌的跳跃装置,它们都朝着一个方向,对着一个巨大的湖,当人踩上去装置可以带你去这个方向无限远的地方,享受飞行的乐趣.但是 ...

  3. CSS 竖线 点 时间节点

    效果如图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. 加overflow-hidden就可以解决高度塌陷问题,overflow-触发BFC

    1.BFC 全称是块级排版上下文,用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文,但是如果一个块级元素 设置了float:left,overflow:hidden或position ...

  5. Java常用开发思想与知识点小记(一)

    1.   子类在覆盖父类的方法时,不能抛出比父类更多的异常(儿子不能比父亲干更多的坏事),所以只能捕捉异常,通常在web层捕获异常,给用户一个友好提示. 2.Java内存模型与并发编程三个特性 htt ...

  6. sk_buff结构

    sk_buff结构用来描述已接收或者待发送的数据报文信息:skb在不同网络协议层之间传递,可被用于不同网络协议,如二层的mac或其他链路层协议,三层的ip,四层的tcp或者udp协议,其中某些成员变量 ...

  7. 64_k1

    KoboDeluxe-0.5.1-22.fc26.x86_64.rpm 13-Feb-2017 22:11 1626454 k3b-17.04.1-1.fc26.x86_64.rpm 25-May-2 ...

  8. Linux(Unix)密码策略问题导致root密码不能修改

    Linux(Unix)密码策略问题导致root密码不能修改 发布时间:  2016-01-19 浏览次数:  1034 下载次数:  5 用户修改了密码配置文件,导致root账户修改密码时报如下错误: ...

  9. perl操作MongoDB

    perl操作MongoDB http://blog.csdn.net/jophyyao/article/details/8223190 Mongodb 的C语言操作 http://blog.csdn. ...

  10. 2017多校第5场 HDU 6085 Rikka with Candies bitset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085 题意:存在两个长度为n,m的数组A,B.有q个询问,每个询问有一个数字k,可以得到Ai%Bj=k ...