poj3233 等比矩阵二分求和

来源:互联网 发布:钢笔日常书法知乎 编辑:程序博客网 时间:2024/05/20 23:07

题意:给定矩阵A

求A+A^2+A^3+.......+A^k


如何转化

令SUM(k)==A+A^2+A^3+.......+A^k

则SUM(k)=(1 + A^(k/2) )   *  (A+A^2+A^3+.......+A^k)  +  A^k   (k为奇数)

          =(1 + A^(k/2) )   *  (A+A^2+A^3+.......+A^k)               (k为数)

直接递归就好


AC代码

#include <bits/stdc++.h>using namespace std;struct Array{int matrix[30][30];}t;int n,k,mod;Array add(Array x,Array y){Array res;memset(res.matrix,0,sizeof(res.matrix));for(int i=0;i<n;i++)for(int j=0;j<n;j++)res.matrix[i][j]=(x.matrix[i][j]+y.matrix[i][j])%mod;return res;}Array mul(Array x,Array y){Array res;memset(res.matrix,0,sizeof(res.matrix));for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++){res.matrix[i][j]+=x.matrix[i][k]*y.matrix[k][j]%mod;res.matrix[i][j]%=mod;}return res;}Array matrix_ksm(Array a,int b){Array res,temp;memset(res.matrix,0,sizeof(res.matrix));for(int i=0;i<n;i++)res.matrix[i][i]=1;temp=a;while(b){if(b&1)res=mul(res,temp);temp=mul(temp,temp);b>>=1;}return res;}Array sum(int k){Array res;if(k==0){memset(res.matrix,0,sizeof(res.matrix));return res;}Array nextsum=sum(k/2);res=add(nextsum,mul(matrix_ksm(t,k/2),nextsum));if(k&1)res=add(res,matrix_ksm(t,k));return res;}int main(){//freopen("in.in","r",stdin);while(scanf("%d%d%d",&n,&k,&mod)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&t.matrix[i][j]);Array ans=sum(k);for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%d ",ans.matrix[i][j]);printf("\n");}}}

原创粉丝点击