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. [BZOJ4212]神牛的养成计划

    [BZOJ4212]神牛的养成计划 试题描述 Hzwer 成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神 ...

  2. [洛谷P4779]【模板】单源最短路径(标准版)

    题目大意:单元最短路径(卡$SPFA$) 题解:$dijkstra$($\underline{\hspace{0.5em}}\underline{\hspace{0.5em}}gnu\underlin ...

  3. [Leetcode] candy 糖果

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

  4. BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 【筛法】

    题目 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号奶牛与1号奶牛相邻 ...

  5. I/O多路转接-epoll

    By francis_hao    Aug 5,2017   APUE讲多路转接的章节介绍了select.pselect和poll函数.而epoll是linux内核在2.5.44引入的.在glibc ...

  6. HDU 多校对抗赛 C Triangle Partition

    Triangle Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Oth ...

  7. node读取文件夹名

    const fs = require('fs'); const join = require('path').join; /** * * @param startPath 起始目录文件夹路径 * @r ...

  8. oracle中分页的知识

    一:前言 自从出来实习后,基本上都没有按下心来总结下自己学的知识点,刚刚好现在快要国庆了,没有到深圳出差,在公司呆了三天,可以说是在公司打了三天的酱油啊,所以前两天都是在看些正则的文档,并且写了下总结 ...

  9. 【STSRM12】夏令营(分治决策单调+主席树)

    [题意]n个数字分成k段,每一段的价值是段内不同数字的个数,求最大价值.n<=35000,k<=50. [算法]分治决策单调+主席树(可持久化线段树) [题解] f[i][j]表示前i天分 ...

  10. Kali Linux中前十名的Wifi攻击工具

    无 线网络的攻与防一直是比较热门的话题,由于无线信号可以被一定范围内的任何人接收到(包括死黑阔),这样就给WIFI带来了安全隐患:路由器生产厂商和网 络服务供应商(ISPs)的配置大多是默认开启了WP ...