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

#include<cstdio>
#include<cstring>
using namespace std;
const int N = 65;
int n, m, k;
struct Matrix {
int mat[N][N];
Matrix() { memset(mat, 0, sizeof mat); }
};
Matrix operator * (Matrix A, Matrix B) {
Matrix C;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
(C.mat[i][j] += A.mat[i][k] * B.mat[k][j]) %= m;
}
}
}
return C;
}
Matrix operator ^ (Matrix A, int x) {
Matrix B;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i == j) B.mat[i][j] = 1;
}
}
while(x) {
if(x & 1) B = B * A;
A = A * A;
x >>= 1;
}
return B;
}
int main() {
scanf("%d%d%d", &n, &k, &m);
Matrix A;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d", &A.mat[i][j]);
}
}
// 右边的单位矩阵
for(int i = 0; i < n; i++) {
for(int j = n; j < 2 * n; j++) {
if(j - i == n) A.mat[i][j] = 1;
}
}
// 右下方的单位矩阵
for(int i = n; i < 2 * n; i++) {
for(int j = n; j < 2 * n; j++) {
if(i == j) A.mat[i][j] = 1;
}
}
// 下方的 0 矩阵,省略
// ... n <<= 1;
A = A ^ (k + 1);
n >>= 1; // 将右边的矩阵减去一个单位矩阵
for(int i = 0; i < n; i++) {
for(int j = n; j < 2 * n; j ++) {
if(j - i == n) A.mat[i][j] = (A.mat[i][j] - 1 + m) % m;
printf("%d%c", A.mat[i][j], " \n"[j == 2 * n - 1]);
}
}
return 0;
}

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. 【NOIP模拟赛】Evensgn 的债务 乱搞

    biubiu~~~ 我们发现按照这道题的题意我们把一个个人的前后(欠钱,被欠钱)都缩一下,那么他对其他人没有影响,那么我们就可以依次缩完每个人,而且每个人最后的状态都是要买欠要么被欠,那么我们可以知道 ...

  2. java禁止实例化的工具类

    public class Q { /** * @param args */ public static void main(String[] args) { new Person() } } clas ...

  3. centos7上安装docker-ce社区版

    报错:Error: docker-ce-selinux conflicts with 2:container-selinux-2.12-2.gite7096ce.el7.noarch 转载:http: ...

  4. jw player学习笔记三---发布到其它网站

    一.通过官网发布向导 登陆 http://www.longtailvideo.com,注册一个账号,进入你的用户管理中心,如下图 然后按提示,一步步操作,就会得到js代码了. 二.自己服务器发布 &l ...

  5. 2、Distributed Optimization

    一.目录: Distributed dynamic programming (as applied to path-planning problems). Distributed solutions ...

  6. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...

  7. Gradle体验/第一篇:下装、安装、配置、体验

    http://jingyan.baidu.com/article/4d58d541167bc69dd4e9c009.html

  8. webstorm es6 语法报错

    设置settings javascript language version后 <script>标签加个 type <script type="text/ecmascrip ...

  9. Nginx的主要配置参数说明

    #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...

  10. mongodb的数据库操作

    1.创建数据库 语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 1.创建数据库 > show dbs ...