快速幂(矩阵)

//矩阵快速幂 
//满足c[x][y]=∑(i=1,i<=n)a[x][i]*b[i][y],其中c=a*b 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define ll long long
#define MOD 1000000007
using namespace std;
ll n,k;
struct uio{
    ll squ[101][101],n,m;
}mat;
uio multiply(uio x,uio y)
{
    uio z;//暂存结果 
    if(x.m!=y.n) return z;
    z.n=x.n,z.m=y.m;
    for(ll i=1;i<=z.n;i++)
        for(ll j=1;j<=z.m;j++)
        {
            z.squ[i][j]=0;
            for(ll l=1;l<=x.m;l++)
                z.squ[i][j]=(z.squ[i][j]+x.squ[i][l]*y.squ[l][j])%MOD;
        }
    return z;
}
uio fast_exponentiation(uio x,ll k)//与普通快速幂结构相同 
{
    uio ans=x,y=x;
    k--;//ans=x表示已经乘过一次了 因此次数减一 
    while(k>0)
    {
        if(k%2==1)
            ans=multiply(y,ans);
        y=multiply(y,y);
        k/=2;
    }
    return ans;
}
int main()
{
    scanf("%lld%lld",&n,&k);
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=n;j++)
            scanf("%lld",&mat.squ[i][j]);
    mat.m=mat.n=n;
    mat=fast_exponentiation(mat,k);
    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=n;j++)
            printf("%lld ",mat.squ[i][j]);
        printf("
");
    }
     return 0;
}
原文地址:https://www.cnblogs.com/water-radish/p/9280614.html