Matrix Power Series

思路

题意比较简单,就是要求S(n)=∑i=1nAiS(n) = \sum _{i = 1} ^{n} A^ {i}S(n)=∑i=1n​Ai,显然有S(n)=S(n−1)∗A+AS(n) = S(n - 1) * A + AS(n)=S(n−1)∗A+A,看到这里,那就简单了,递推式,加矩阵,矩阵快速幂无疑了嘛,所以我们开始构造矩阵。

显然有如下矩阵,EEE是单位矩阵,AAA是输入矩阵,OOO是零矩阵。

[EEOA]∗[OOAO]\begin{bmatrix} E & E \\ O & A\end{bmatrix} * \begin{bmatrix} O & O\\ A & O \end{bmatrix}[EO​EA​]∗[OA​OO​]

通过这个矩阵的递推,我们就可以通过快速幂,达到快速求解的目的。

我严重怀疑这道题目数据有问题,longlonglong\ longlong long就wawawa,然后intintint就过了???

AC代码

/*Author : lifehappy
*/
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #include <bits/stdc++.h>#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cmath>#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 70;int n, k, mod;struct matrix {int a[N][N];matrix operator * (const matrix & t) const {matrix temp;for(int i = 1; i <= 2 * n; i++) {for(int j = 1; j <= 2 * n; j++) {temp.a[i][j] = 0;for(int k = 1; k <= 2 * n; k++) {temp.a[i][j] = (temp.a[i][j] + a[i][k] * t.a[k][j]) % mod;}}}return temp;}
}E, A, O;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), k = read(), mod = read();matrix fat, ans;for(int i = 1; i <= 2 * n; i++) {//先置零,for(int j = 1; j <= 2 * n; j++) {fat.a[i][j] = ans.a[i][j] = 0;}}for(int i = 1; i <= n; i++) {//读入的时候置A加上置E矩阵。for(int j = 1; j <= n; j++) {fat.a[i + n][j + n] = ans.a[i + n][j] = read();}fat.a[i][i] = fat.a[i][i + n] = 1;}while(k) {if(k & 1) ans = fat * ans;fat = fat * fat;k >>= 1;}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {printf("%d%c", ans.a[i][j], j == n ? '\n' : ' ');}}return 0;
}

调不出来的代码

写了一手逼格高一点的举证套矩阵的重载操作符的写法,可是太菜了,调不出来

/*Author : lifehappy
*/
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #include <bits/stdc++.h>#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cmath>#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 70;int n, k, mod;struct matrix {int a[N][N];matrix operator * (const matrix & t) const {matrix temp;for(int i = 1; i <= 2 * n; i++) {for(int j = 1; j <= 2 * n; j++) {temp.a[i][j] = 0;for(int k = 1; k <= 2 * n; k++) {temp.a[i][j] = (temp.a[i][j] + a[i][k] * t.a[k][j]) % mod;}}}return temp;}matrix operator + (const matrix & t) const {matrix temp;for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {temp.a[i][j] = (a[i][j] + t.a[i][j]) % mod;}}return temp;}
}E, A, O;struct Matrix {matrix a[3][3];Matrix operator * (const Matrix & t) const {Matrix temp;for(int i = 1; i <= 2; i++) {for(int j = 1; j <= 2; j++) {temp.a[i][j] = O;for(int k = 1; k <= 2; k++) {temp.a[i][j] = (a[i][k] * t.a[k][j]) + temp.a[i][j];}}}}
};int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), k = read(), mod = read();for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {A.a[i][j] = read();E.a[i][j] = O.a[i][j] = 0;}E.a[i][i] = 1;}Matrix fat, ans;fat.a[1][1] = E, fat.a[1][2] = E, fat.a[2][1] = O, fat.a[2][2] = A;ans.a[1][1] = O, ans.a[1][2] = O, ans.a[2][1] = A, ans.a[2][2] = O;while(k) {if(k & 1) ans = ans * fat;fat = fat * fat;k >>= 1;}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {printf("%d%c", ans.a[1][1].a[i][j], j == n ? '\n' : ' ');}}return 0;
}

poj 3233 Matrix Power Series相关推荐

  1. poj 3233 Matrix Power Series

    最近一直在做矩阵的题目,这算是一道简单题目吧. 建立一个矩阵的结构体,便于赋值和返回值. S = A + A2 + A3 + - + Ak 如果 S=A+A2 + A3 +A4   S= (A + A ...

  2. POJ 3233 Matrix Power Series 矩阵快速幂 + 二分

    题意:求矩阵的次方和 解题思路:最容易想到方法就是两次二分因为 我们可以把一段  A^1 + A^2 + .......A^K   变成  A^1 + ..A^(K/2) +( A^1 + ..A^( ...

  3. POJ 3233 Matrix Power Series (矩阵分块,递推)

    矩阵乘法是可以分块的,而且幂的和也是具有线性的. 不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1.然后矩阵快速幂就可以了. /*************************** ...

  4. POJ 3233 Matrix Power Serie

    题意:给一个n×n的矩阵A,求S = A + A2 + A3 + - + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...

  5. POJ 3233 Matrix Power Serie (矩阵快速幂)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. ...

  6. poj 3323 Matrix Power Series (矩阵乘法 非递归形式)

    为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力 # ...

  7. 【矩阵乘法】Matrix Power Series(poj 3233)

    Matrix Power Series poj 3233 题目大意 给你一个矩阵A,让你求S=A+A2+A3+-+AkS = A + A^2 + A^3 + - + A^kS=A+A2+A3+-+Ak ...

  8. Matrix Power Series

    http://poj.org/problem?id=3233 题解: 构造矩阵: a:A        1 b:A        0 A        1 其中 矩阵套矩阵: A代表原矩阵: 1代表单 ...

  9. POJ3233 Matrix Power Series

    原题传送:http://poj.org/problem?id=3233 两个二分:二分 k ,二分矩阵. 求Sn = A + A2 + A3 + - + Ak. 首先我们能矩阵二分快速幂计算出Ak,那 ...

最新文章

  1. Android--ViewPager点击按钮切换下一页
  2. 给定圆的半径r,求圆的面积。
  3. 第5篇K8S创建资源的两种方式
  4. Win32项目关于MessageBox参数的详细说明
  5. python的array如何使用map_你应该了解的JavaScript Array.map()五种用途小结
  6. 实时计算Flink 快速入门 —— 步骤二:注册上下游存储
  7. API(应用程序编程接口)
  8. PHP做好防盗链的基本思想 防盗链的设置方法
  9. DSP28335定时器
  10. 手机网站制作html5,【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?...
  11. Crosses and Crosses POJ 3537
  12. linux安装Vim-plug和配置.vimrc文件
  13. 2022东南大学网安916考研经验贴
  14. 摘-连载-《青青子衿》(念才)-采葛-96
  15. Jie Business Project
  16. js自定义提示框弹窗
  17. win7+bugzilla+apache+mysql+activePerl
  18. android图片压缩的三种方式
  19. c语言里的fun是什么函数,c语言fun函数有什么作用
  20. 仿网易考拉完整源码+答辩ppt(java+mysql+JavaScript)资源详细说明

热门文章

  1. geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
  2. 这些全国各地甜点,你都吃过了吗?
  3. 勾股定理的面积证明法,形象又好记!
  4. 施一公:中国还缺乏真正的世界顶尖大学,研究生该听听这些建议
  5. 道理我都懂,但你到底为什么偏偏喜欢咬我??
  6. 弱引用什么时候被回收_Java基础 强引用、弱引用、软引用、虚引用
  7. lua loadstring传递参数_lua学习之函数篇
  8. 七0二所与江南计算机研究所,江南大学:一所被低估的“211”大学,2个A+学科,丝毫不输985...
  9. java long to float_为什么Java中long可以自动转换成float
  10. oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...