矩阵快速幂--poj3233

来源:互联网 发布:项目数据分析师培训 编辑:程序博客网 时间:2024/05/16 00:46

这个不是直接求矩阵快速幂,是求的和,但可以转化成快速幂。

参见《挑战程序设计竞赛》。

下面是代码:

#include<iostream>#include<set>#include<map>#include<vector>#include<cmath>#include<climits>#include<cstdio>#include<string>#include<cstring>#include<algorithm>typedef long long LL;using namespace std;int n,m,k;typedef vector<int> vec;typedef vector<vec> mat;mat mul(mat &A,mat &B){    mat C(A.size(),vec(A.size()));    for(int i=0; i<A.size(); i++)        for(int j=0; j<B[0].size(); j++)            for(int k=0; k<B.size(); k++)                C[i][j]=(C[i][j]+A[i][k]*B[k][j])%m;    return C;}mat pow(mat A,LL n){    mat B(A.size(),vec(A.size()));    for(int i=0; i<A.size(); i++)        B[i][i]=1;    while(n>0)    {        if(n&1)            B=mul(B,A);        A=mul(A,A);        n>>=1;    }    return B;}void solve(mat A){    mat B(n*2,vec(n*2));    for(int i=0; i<n; i++)    {        for(int j=0; j<n; j++)            B[i][j]=A[i][j];        B[i+n][i]=B[i+n][i+n]=1;    }    B=pow(B,k+1);    for(int i=0; i<n; i++)    {        for(int j=0; j<n; j++)        {            int a=B[n+i][j]%m;            if(i==j) a=(a+m-1)%m;            printf("%d%c",a,j+1==n?'\n':' ');        }    }}int main(){    //freopen("in.txt","r",stdin);    cin>>n>>k>>m;    int x;    mat A(n,vec(n));    for(int i=0; i<n; i++)        for(int j=0; j<n; j++)        {            cin>>A[i][j];        }    solve(A);    return 0;}