poj3233

题意

给出一个 \(n \times n\) 的矩阵 \(A\) ,求 \(A + A^2 + A^3 + ... + A^k\) 。

分析

构造矩阵

\[\begin{bmatrix} A & E \\ 0 & E \\ \end{bmatrix}
\]

记为 \(B\) ,其中 \(A\) 为原矩阵,\(E\) 为 \(n \times n\) 的单位矩阵,\(0\) 为 \(n \times n\) 的零矩阵。

那么求 \(B^{k+1}\) ,

\[\begin{bmatrix} A^{k+1} & E+A+A^2+..+A^{k} \\ 0 & E \end{bmatrix}
\]

可以发现右边减去一个单位矩阵就是我们所要求的答案。

code

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int N = 65;
  5. int n, m, k;
  6. struct Matrix {
  7. int mat[N][N];
  8. Matrix() { memset(mat, 0, sizeof mat); }
  9. };
  10. Matrix operator * (Matrix A, Matrix B) {
  11. Matrix C;
  12. for(int i = 0; i < n; i++) {
  13. for(int j = 0; j < n; j++) {
  14. for(int k = 0; k < n; k++) {
  15. (C.mat[i][j] += A.mat[i][k] * B.mat[k][j]) %= m;
  16. }
  17. }
  18. }
  19. return C;
  20. }
  21. Matrix operator ^ (Matrix A, int x) {
  22. Matrix B;
  23. for(int i = 0; i < n; i++) {
  24. for(int j = 0; j < n; j++) {
  25. if(i == j) B.mat[i][j] = 1;
  26. }
  27. }
  28. while(x) {
  29. if(x & 1) B = B * A;
  30. A = A * A;
  31. x >>= 1;
  32. }
  33. return B;
  34. }
  35. int main() {
  36. scanf("%d%d%d", &n, &k, &m);
  37. Matrix A;
  38. for(int i = 0; i < n; i++) {
  39. for(int j = 0; j < n; j++) {
  40. scanf("%d", &A.mat[i][j]);
  41. }
  42. }
  43. // 右边的单位矩阵
  44. for(int i = 0; i < n; i++) {
  45. for(int j = n; j < 2 * n; j++) {
  46. if(j - i == n) A.mat[i][j] = 1;
  47. }
  48. }
  49. // 右下方的单位矩阵
  50. for(int i = n; i < 2 * n; i++) {
  51. for(int j = n; j < 2 * n; j++) {
  52. if(i == j) A.mat[i][j] = 1;
  53. }
  54. }
  55. // 下方的 0 矩阵,省略
  56. // ...
  57. n <<= 1;
  58. A = A ^ (k + 1);
  59. n >>= 1;
  60. // 将右边的矩阵减去一个单位矩阵
  61. for(int i = 0; i < n; i++) {
  62. for(int j = n; j < 2 * n; j ++) {
  63. if(j - i == n) A.mat[i][j] = (A.mat[i][j] - 1 + m) % m;
  64. printf("%d%c", A.mat[i][j], " \n"[j == 2 * n - 1]);
  65. }
  66. }
  67. return 0;
  68. }

poj3233(等比矩阵求和)的更多相关文章

  1. poj 1195:Mobile phones(二维树状数组,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14489   Accepted: 6735 De ...

  2. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  3. UVA 11149-Power of Matrix(等比矩阵求和)

    给定一个矩阵A 要求A + A^2 + A^3 +…. A^k: 对于到n的等比矩阵求和 如果n是偶数:  如果n是奇数:  #include<stdio.h> #include<s ...

  4. BZOJ 2901: 矩阵求和

    2901: 矩阵求和 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 411  Solved: 216[Submit][Status][Discuss] ...

  5. BZOJ_2901_矩阵求和_前缀和

    BZOJ_2901_矩阵求和_前缀和 Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. Input 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一 ...

  6. YTU 2442: C++习题 矩阵求和--重载运算符

    2442: C++习题 矩阵求和--重载运算符 时间限制: 1 Sec  内存限制: 128 MB 提交: 1457  解决: 565 题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运 ...

  7. YTU 2640: 编程题:运算符重载---矩阵求和

    2640: 编程题:运算符重载---矩阵求和 时间限制: 1 Sec  内存限制: 128 MB 提交: 484  解决: 190 题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重 ...

  8. hdu 1588(Fibonacci矩阵求和)

    题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...

  9. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

随机推荐

  1. P1717 钓鱼

    题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼,但是,因为还要准备2013NO ...

  2. [Leetcode] candy 糖果

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  3. BZOJ1095 [ZJOI2007]Hide 捉迷藏 【动态点分治 + 堆】

    题目链接 BZOJ1095 题解 传说中的动态点分治,一直不敢碰 今日一会,感觉其实并不艰涩难懂 考虑没有修改,如果不用树形dp的话,就得点分治 对于每个重心,我们会考虑其分治的子树内所有点到它的距离 ...

  4. 【ZJ选讲·画山】

    给出一张纸(N × M),你要在上面画山,但不能画出界(N,M<=100) Like this: 起点为(0,0),终点为(N,0) 给出w种线段画法(x,y),表示用了这种画法后,笔迹末 ...

  5. C语言的getopt

    By francis_hao    Jul 5,2017   getopt:分析命令行选项 概述 #include <unistd.h>int getopt(int argc, char ...

  6. HDU1213:How Many Tables(并查集)

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. Ubuntu系统iptables规则的查看和清除

    系统不支持service iptables restart,service iptables status,如何查看与清除iptable的规则呢? 一 iptables查看基本语法 iptables ...

  8. tomcat内存配置(二)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进 ...

  9. delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的

    public void TestF() { Test += Fun; } public void Fun(Person p) { }  // 如 Person变成 SubPerson,则报错..pub ...

  10. Spring学习-- Bean 的作用域

    Bean 的作用域: 在 Spring 中 , 可以在 <bean> 元素的 scope 属性里设置 bean 的作用域. 默认情况下 , Spring 只为每个在 IOC 容器里声明的 ...