矩阵快速幂(裸,模板)

题目来源:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1137
【题意】
中文题意不在叙述,只是让求一个矩阵的乘法而已。
【思路】
终于可以做矩阵快速幂的题了,这个专题一直被我拖到现在,作为一个弱弱内心无比难受,终于可以把它学了,十分开心。
此题非常裸,直接重载一个乘号运算符就可以了,只不过矩阵乘法要知道怎么回事。不知道的可以看下这位大佬的博客,知道的也就可以看下,加深理解:矩阵乘法
并且初始矩阵这个概念也要知道,这些可以看下大佬的矩阵快速幂视频
【代码】

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int mod=1e9+7;
typedef unsigned long long ll;
typedef long long LL;
const int N=100+10;
LL n,m;
struct mat
{
    LL a[N][N];
};
mat operator*(mat s,mat t)
{
    mat r;
    LL x;
    mem(r.a,0);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            x=0;
            for(int k=1; k<=n; k++)
                x+=(s.a[i][k]*t.a[k][j])%mod;
            r.a[i][j]=x%mod;
        }
    return r;
}
void init(mat& s)
{
    for(int i=1; i<=n; i++)
        s.a[i][i]=1;
}
mat pow_quick(mat r)
{
    mat ans;
    init(ans);
    while(m)
    {
        if(m&1)
            ans=ans*r;
        r=r*r;
        m>>=1;
    }
    return ans;
}
int main()
{

    mat t;
    scanf("%lld%lld",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            scanf("%lld",&t.a[i][j]);
    t=pow_quick(t);
    for(int i=1; i<=n; i++)
    {
        printf("%lld",t.a[i][1]);
        for(int j=2; j<=n; j++)
            printf(" %lld",t.a[i][j]);
        printf("\n");
    }
}

你可能感兴趣的:(ACM竞赛,【数论】--矩阵快速幂,ACM的进程)