矩阵快速幂

来源:互联网 发布:淘宝售后可以申请几次 编辑:程序博客网 时间:2024/06/06 13:25
#include<iostream>#include<cstdio>#include<cstring>const int maxn=100+10;#define ll long longconst int b=1000000000+7;using namespace std;ll  a[maxn][maxn],s[maxn][maxn],tmp[maxn][maxn];int main(){    int n;ll k;    cin>>n>>k;    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++){            scanf("%lld",&a[i][j]);            s[i][j]=a[i][j];        }    k--;    while(k){        if(k%2){            memset(tmp,0,sizeof(tmp));            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)                                        for(int k=1;k<=n;k++){                        tmp[i][j]+=s[i][k]*a[k][j];                                            tmp[i][j]%=b;                    }            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++){                    s[i][j]=tmp[i][j];                }        }        memset(tmp,0,sizeof(tmp));        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                                    for(int k=1;k<=n;k++){                    tmp[i][j]+=a[i][k]*a[k][j];                                        tmp[i][j]%=b;                }        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                a[i][j]=tmp[i][j]%b;            }        k/=2;        }    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            printf("%lld%c",s[i][j],j==n?'\n':' ');    return 0;}