矩阵的n次幂(转)


模板:

#include<bits/stdc++.h>
using namespace std;
long long int mod=1e9+7;
int n;

struct asd                                结构体貌似没太大用

{

    long long int a[102][102];
};
asd mul(asd x,asd y)      x和y的矩阵相乘
{
    asd ans;
    memset(ans.a,0,sizeof(ans.a));
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            for(int k=0; k<n; k++)
                ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
    return ans;
}
asd quickmul(int g,asd x)
{
    asd ans;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            if(i==j)
                ans.a[i][j]=1;
            else
                ans.a[i][j]=0;
    while(g)
    {
        if(g&1) 
            ans=mul(ans,x);
        x=mul(x,x);
        g>>=1;
    }
    return ans;
}


int main()
{
    int m;
    scanf("%d%d",&n,&m);
    asd x;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            scanf("%lld",&x.a[i][j]);
    x=quickmul(m,x);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(j)
                printf(" ");
            printf("%lld",x.a[i][j]);
        }
        puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80488178