zoukankan      html  css  js  c++  java
  • 快速幂(矩阵)

    //矩阵快速幂 
    //满足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;
    }
  • 相关阅读:
    top-adx-apps
    mac 打印机无法打印
    doubleclick-video-skipable
    微信小程序-基础学习
    uniapp-学习总结1
    react-1
    mysql-1
    jenkins-1
    后台管理系统-1
    微信小程序-父子组件通信
  • 原文地址:https://www.cnblogs.com/water-radish/p/9280614.html
Copyright © 2011-2022 走看看