poj_3233_Matrix Power Series(二分+矩阵快速幂)
来源:互联网 发布:python连接db2数据库 编辑:程序博客网 时间:2024/04/28 15:24
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 ≤ 109) and m (m < 104). 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 40 11 1
Sample Output
1 22 3
Source
题型:数论
题意:A是n*n的矩阵,计算 S = A + A^2 + A^3 + … + A^k。
分析:
首先可以想到用矩阵快速幂算出A^k,但是TLE,因为加的项过多,所以要将计算规模减小。
使用二分的思想进行处理:
对于k=2n,设B = A + A^2 + .. + A^n ,则 S = B * An + B。
对于k=2n+1,S = B * A^n + B + A^(2n+1)。
这样就可以不断递归,每次规模减小一半。
(一开始用了LL,TLE了好久。。。)
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int n,k,m;struct Matrix{ int mat[31][31];};Matrix Mod(Matrix a){ Matrix res; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ res.mat[i][j]=a.mat[i][j]%m; } } return res;}Matrix mul(Matrix m1,Matrix m2){ Matrix ans; memset(ans.mat,0,sizeof(ans.mat)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) ans.mat[i][j]=(ans.mat[i][j]+m1.mat[i][k]*m2.mat[k][j]%m)%m; return Mod(ans);}Matrix pow(Matrix m1,int b){ Matrix ans; for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans.mat[i][j]=(i==j?1:0); while(b) { if(b&1) ans=mul(ans,m1); m1=mul(m1,m1); b/=2; } return ans;}Matrix Add(Matrix a,Matrix b){ Matrix res; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ res.mat[i][j]=(a.mat[i][j]+b.mat[i][j])%m; } } return res;}Matrix Sum(Matrix b,int t){ Matrix res; Matrix a=Mod(b); if(t==1){ res=a; return res; } else{ Matrix k=Sum(a,t/2); if(t&1){ Matrix o=pow(a,t/2+1); return Add(Add(k,o),mul(o,k)); } else{ Matrix o=pow(a,t/2); return Add(k,mul(k,o)); } }}int main(){ Matrix a; scanf("%d%d%d",&n,&k,&m); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a.mat[i][j]); a.mat[i][j]%=m; } } Matrix ans=Sum(a,k); for(int i=0;i<n;i++){ printf("%d",ans.mat[i][0]); for(int j=1;j<n;j++){ printf(" %d",ans.mat[i][j]); } printf("\n"); } return 0;}
- poj_3233_Matrix Power Series(二分+矩阵快速幂)
- poj 3233 Matrix Power Series(矩阵二分,快速幂)
- POJ Matrix Power Series (矩阵快速幂+二分)
- poj3233 Matrix Power Series (矩阵快速幂+二分)
- Matrix Power Series(poj3233快速幂+矩阵二分幂+分治)
- poj 3233 Matrix Power Series 矩阵 快速幂 两次二分
- POJ 3233 Matrix Power Series(矩阵快速幂+二分求和)
- POJ 3233 Matrix Power Series 矩阵快速幂+二分
- POJ 3233 Matrix Power Series 矩阵快速幂+二分
- POJ - Matrix Power Series 【矩阵快速幂+二分求和】
- POJ 3233 Matrix Power Series (矩阵快速幂 + 二分)
- POJ3233 - Matrix Power Series - 二分矩阵快速幂
- POJ 3233 Matrix Power Series(矩阵快速幂+二分)
- POJ 3233 Matrix Power Series (矩阵快速幂+二分)
- POJ3233---Matrix Power Series(矩阵快速幂+二分)
- POJ3233 Matrix Power Series 矩阵快速幂+二分求和
- PKU 3233 Matrix Power Series(矩阵快速幂 二分)
- poj 1995 Matrix Power Series 二分+矩阵快速幂
- Python 扩展包 win环境下的快速安装
- LCD 画线方法及C语言实现(转贴)
- Poj 3321 Apple Tree - 树状数组
- 回文串 O(n)算法 Manacher算法(第二部分)
- 理解嵌入式开发中的一些硬件相关的概念
- poj_3233_Matrix Power Series(二分+矩阵快速幂)
- 【一句话博客】_CodeForces 55D Beautiful numbers
- 电脑C盘扩容
- Android中进行图像旋转
- 黑马程序员------<补>String 综合练习
- Oracle更新OPatch工具版本 的方法说明
- Hibernate 学习总结
- 黑马程序员_JAVA笔记02——标识符、进制、变量、运算符、if和switch语句
- 在场景中多个用户运行一个相同脚本