Matrix Power Series(矩阵快速幂+二分求矩阵和)

#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#include <set>#include <map>#include <queue>using namespace std;const int inf=0x3f3f3f3f;int n,mod;struct node{int mp[50][50];}init,res;struct node Mult(struct node x,struct node y){struct node tmp;int i,j,k;for(i=0;i<n;i++)for(j=0;j <n;j++){tmp.mp[i][j]=0;for(k=0;k<n;k++){tmp.mp[i][j]=(tmp.mp[i][j]+x.mp[i][k]*y.mp[k][j])%mod;}}return tmp;};struct node expo(struct node x,int k){struct node tmp;int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j)tmp.mp[i][j]=1;elsetmp.mp[i][j]=0;}while(k){if(k&1) tmp=Mult(tmp,x);x=Mult(x,x);k>>=1;}return tmp;};struct node add(struct node x,struct node y){struct node tmp;int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){tmp.mp[i][j]=(x.mp[i][j]+y.mp[i][j])%mod;}return tmp;};struct node sum(struct node x,int k){struct node tmp,y;if(k==1) return x;tmp=sum(x,k/2);if(k&1){y=expo(x,k/2+1);tmp=add(Mult(y,tmp),tmp);return add(tmp,y);}else{y=expo(x,k/2);return add(Mult(y,tmp),tmp);}};int main(){int m,k,i,j,x;scanf("%d %d %d",&n,&k,&mod);for(i=0;i<n;i++)for(j=0;j<n;j++){scanf("%d",&x);init.mp[i][j]=x%mod;}res=sum(init,k);for(i=0;i<n;i++){for(j=0;j<n;j++){if(j==n-1)printf("%d\n",res.mp[i][j]);elseprintf("%d ",res.mp[i][j]);}}return 0;}

,到底通向了什么样的远方呢?

Matrix Power Series(矩阵快速幂+二分求矩阵和)

相关文章:

你感兴趣的文章:

标签云: