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

    #include<cstdio> 
    #include<cstring>
    #include<cmath>
    #include<ctime>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<set>
    #define maxint (2147483647)
    #define l(a) ((a)<<1)
    #define r(a) ((a)<<1|1)
    #define b(a) (2<<(a))
    #define rep(i,a,b) for(int i=a;i<=(b);i++)
    #define clr(a) memset(a,0,sizeof(a))
    typedef long long ll;
    using namespace std;
    int readint(){
        int t=0,f=1;char c=getchar();
        while(!isdigit(c)){
            if(c=='-') f=-1;
            c=getchar();
        }
        while(isdigit(c)){
            t=(t<<3)+(t<<1)+c-'0';
            c=getchar();
        }
        return t*f;
    }
    ll readll(){
        ll t=0ll,f=1ll;char c=getchar();
        while(!isdigit(c)){
            if(c=='-') f=-1ll;
            c=getchar();
        }
        while(isdigit(c)){
            t=(t<<3ll)+(t<<1ll)+ll(c-'0');
            c=getchar();
        }
        return t*f;
    }
    const int maxn=109;
    const ll mod=1e9+7;
    int n;
    ll k;
    struct matrix{
        int a,b;
        ll x[maxn][maxn];
        inline matrix operator*(const matrix A)const{
            matrix B;B.clear();B.a=a;B.b=A.b;
            rep(i,1,a){
                rep(j,1,A.b){
                    rep(k,1,b) B.x[i][j]=(B.x[i][j]+x[i][k]*A.x[k][j])%mod;
                }
            }
            return B;
        }
         inline matrix operator^(const ll k)const{
            ll t=k;matrix A,B;
            A.a=B.a=a;A.b=B.b=b;
            rep(i,1,a)
                rep(j,1,b) A.x[i][j]=x[i][j];
            B.clear();
            rep(i,1,a) B.x[i][i]=1;
            while(t){
                if(t&1) B=B*A;
                A=A*A;t>>=1ll;
            }
            return B;
        }
        inline void clear(){
            rep(i,1,a)
                rep(j,1,b) x[i][j]=0;
        }
        inline void in(int _a,int _b){
            a=_a;b=_b;
            rep(i,1,_a)
                rep(j,1,_b) x[i][j]=readint();
        }
        inline void out(){
            rep(i,1,a){
                rep(j,1,b){
                    printf("%lld",x[i][j]);
                    putchar(j==b?'
    ':' ');
                }
            }
        }
    }X;
    int main(){
        //freopen("#intput.txt","r",stdin);
        //freopen("#output.txt","w",stdout);
        n=readint();k=readll();X.in(n,n);     
        matrix Ans=X^k;
        Ans.out();
        //fclose(stdin);
        //fclose(stdout);
        return 0;
    }
    View Code
  • 相关阅读:
    MongoDB知识
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    SQL Server 触发器
    TSQL游标使用
    python和C#的区别
    bcp和SqlDataAdapter进行批量跟新插入方法
    SQL Server中索引视图用法详解
    hdu 1950 Bridging signals
    UVA 116 Unidirectional TSP
    poj 3230 Travel
  • 原文地址:https://www.cnblogs.com/chensiang/p/7754524.html
Copyright © 2011-2022 走看看