等比矩阵求和-POJ3233
来源:互联网 发布:淘宝流量充值怎么开店 编辑:程序博客网 时间:2024/06/06 01:20
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^k temp=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
- poj3233 等比矩阵二分求和
- POJ3233 矩阵幂求和
- HDOJ-2243 AC自动机.等比矩阵求和
- poj3233Matrix Power Series (等比矩阵求和)
- POJ3233 矩阵的N次幂求和 二分
- POJ3233 Matrix Power Series 矩阵快速幂+二分求和
- 等比求和
- poj 3233 Matrix Power Series(等比矩阵求和)
- hdu 1588 Gauss Fibonacci(函数嵌套、转换、等比矩阵求和)
- POJ - 3233 Matrix Power Series (矩阵等比二分求和)
- poj 3233 Matrix Power Series(等比矩阵求和)
- POJ 3233 - Matrix Power Series(等比矩阵求和)
- UVA 11149-Power of Matrix (等比矩阵求和)
- UVA 11149-Power of Matrix (等比矩阵求和)
- 等比矩阵求和超简法及其python代码10行实现
- POJ3233矩阵快速幂
- poj3233——矩阵
- 使用Visual Studio快速开发STM32F4-Discovery探索板入门
- kafka学习
- Kotlin学习笔记二(数据类型)
- 求大神反编译个程序
- 【C语言】【unix c】如何创建有名管道
- 等比矩阵求和-POJ3233
- 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- Fast Fourier Transform
- javascript之BOM对象(三其他对象)
- Diary I
- android 百度搜索接口
- 静态代理,动态代理,Cglib代理
- NLP深度学习 —— CS224学习笔记9
- spring boot 集成spring security