等比矩阵求和-POJ3233
https://vjudge.net/contest/182427#problem/B
Description
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
Input
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 10^9) and m (m < 10^4). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output
Output the elements of S modulo m in the same way as A is given.
Sample Input
2 2 4
0 1
1 1
Sample Output
1 2
2 3
Source
POJ Monthly–2007.06.03, Huang, Jinsong
如果k为偶数,那么(A+A^2+….A^K) = (A+…+A^K/2)+A^K/2*(A+…+A^K/2)
如果k为奇数,那么(A+A^2+….A^K) = (A+…+A^K/2)+A^K/2*(A+…+A^K/2)+A^k
S(k)=A+A^2+……+A^k
偶数: S(k)=S(k/2)+S(k/2)*A^(k/2)
奇数: S(k)=S(k/2)+S(k/2)*A^(k/2)+A^k;
直接用快速幂计算需要O(n)的时间,10^9的数据会超时
通过上面的公式解决超时问题
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n,k,mod;
struct Matrix
{int a[35][35];
};
Matrix m,unit;
Matrix add(Matrix x,Matrix y)//矩阵加法
{Matrix ans;for(int i=0; i<n; i++)for(int j=0; j<n; j++){ans.a[i][j]=0;ans.a[i][j]=(x.a[i][j]+y.a[i][j])%mod;}return ans;
}
Matrix multi(Matrix x,Matrix y)//矩阵乘法
{Matrix ans;for(int i=0; i<n; i++)for(int j=0; j<n; j++){ans.a[i][j]=0;for(int k=0; k<n; k++)ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j])%mod;}return ans;
}
Matrix mqmod(int l)//快速幂
{Matrix p,q;p=m,q=unit;while(l){if(l&1)q=multi(q,p);p=multi(p,p);l>>=1;}return q;
}
Matrix matrixsum(int k)//利用公式递归求解
{if(k==1)return m;Matrix temp,tnow;temp=matrixsum(k/2);tnow=mqmod(k/2);temp=add(temp,multi(temp,tnow));if(k&1)//奇数的时候多加上A^ktemp=add(mqmod(k),temp);return temp;
}
int main()
{scanf("%d%d%d",&n,&k,&mod);int q;for(int i=0; i<n; i++)for(int j=0; j<n; j++){scanf("%d",&q);m.a[i][j]=q%mod;unit.a[i][j]=(i==j);//如果i==j那么矩阵中此值就是1,否则为0,就是主对角线是1的单位矩阵}Matrix ans;ans=matrixsum(k);for(int i=0; i<n; i++){for(int j=0; j<n-1; j++)printf("%d ",ans.a[i][j]);printf("%d\n",ans.a[i][n-1]);}return 0;
}
等比矩阵求和-POJ3233相关推荐
- 2018第九届蓝桥杯C/C++ B国赛 —— 第六题:矩阵求和
矩阵求和 经过重重笔试面试的考验,小明成功进入 Macrohard 公司工作. 今天小明的任务是填满这么一张表: 表有 n 行 n 列,行和列的编号都从1算起. 其中第 i 行第 j 个元素的值是 g ...
- 输入挂(bzoj 2901: 矩阵求和)
很少用输入挂,以为不超时就好了,但是这题貌似不用过不去啊 只好拿出来用了,当个模板 原理是用getchar()读入会比用scanf快一些 int Read() {int x = 0, f = 1;ch ...
- C语言用数组编程矩阵,二维数组—矩阵求和(C语言)
昨天上机了,之前上机都觉得题目挺简单的,但昨天的题明显比以前难了好吗!字符串二维数组感觉也没教什么呀..所以我也做了蛮久,现依次把这几道题放在这里留作纪念. 题目1:请写一个程序,对于一个m行m列(2 ...
- BZOJ2901: 矩阵求和
题解: 对于表达式用前缀和优化 n^2预处理 n*m查询 #include <algorithm> #include <iostream> #include <cstr ...
- BZOJ 2901: 矩阵求和
2901: 矩阵求和 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 411 Solved: 216 [Submit][Status][Discus ...
- 2018第九届蓝桥杯B组决赛题解第六题 矩阵求和
标题:矩阵求和 经过重重笔试面试的考验,小明成功进入 Macrohard 公司工作. 今天小明的任务是填满这么一张表: 表有 n 行 n 列,行和列的编号都从1算起. 其中第 i 行第 j 个元素的值 ...
- sum 矩阵求和 matlab
matlab中针对的数据大多是以矩阵形式来处理,求和函数是sum 下面通过几个例子来介绍求和函数的应用: matlab中: a=sum(A) %列求和 b=sum(A,2) %行求和 c=sum(A ...
- BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)
BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和) Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值. ...
- matlab div矩阵运算,【求助】多维矩阵求和运算!!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 4-D矩阵:B(:,:,i,j) 具体形式如下! 想对每j列进行对应项求和相加, 整了一上午都-- 谢谢大家! B(:,:,1,1) = 1.0e+010 ...
- 矩阵求和c语言通俗易懂
#include<stdio.h>//标准的输入输出流 #include<stdlib.h>//system("pause")要用 int main(voi ...
最新文章
- 学习PCL库你应该知道的C++特性
- openmv4闪灯说明_OpenMV Cam
- 2014025679 《嵌入式系统程序设计》第五周学习总结
- 指针、数组、函数阶段小结
- boost function对象
- java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
- 探探自动配对PHP_CentOS7 - 安装Apache HTTP Server和PHP
- (71)FPGA模块调用(system Verilog调用VHDL)
- WampServer安装教程
- cmi码型变换matlab程序_58 张图,手把手教会你 Simscape Multibody 物理建模与刚体变换!...
- 树莓派2 安装linux系统安装教程,安装Ubuntu MATE 15.04 for 树莓派2
- python读取XML中bndbox和object name的方法
- Android - 浅谈 Handler 机制
- outlook导入服务器邮件,OUTLOOK怎么导入邮件?
- On-board Diagnostic(OBD)
- 计蒜客 god of gambler
- 通讯录2.0(动态内存增长版本)
- windows的特殊对话框
- cf不能全屏win7的解决方法_怎么解决win7电脑没声音 win7电脑没声音解决方法介绍【详解】...
- Arduino开发教程汇总