zoukankan      html  css  js  c++  java
  • 51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )

    1113 矩阵快速幂


    链接:传送门

    思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板。


    /*************************************************************************
        > File Name: 51nod1113.cpp
        > Author:    WArobot 
        > Blog:      http://www.cnblogs.com/WArobot/ 
        > Created Time: 2017年05月01日 星期一 23时14分35秒
     ************************************************************************/
    
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 110;
    const int MOD  = 1e9 + 7;
    #define mod(x) ((x)%MOD)
    #define ll long long 
    struct mat{
    	int m[maxn][maxn];
    }unit;
    
    int n;
    // 重载*使之能进行矩阵乘法运算
    mat operator * (mat a,mat b){
    	mat ret;
    	ll x;
    	for(int i=0;i<n;i++){
    		for(int j=0;j<n;j++){
    			x = 0;
    			for(int k=0;k<n;k++)
    				x += mod( (ll)a.m[i][k]*b.m[k][j] );
    			ret.m[i][j] = mod(x);
    		}
    	}
    	return ret;
    }
    // 初始化单位矩阵unit
    void init_unit(){
    	for(int i=0;i<maxn;i++)
    		unit.m[i][i] = 1;
    }
    // 计算矩阵a的x次幂
    // 与普通快速幂原理相同
    mat pow_mat(mat a,ll x){
    	mat ret = unit;
    	while(x){
    		if(x&1)	ret = ret*a;
    		a = a*a;
    		x >>= 1;
    	}
    	return ret;
    }
    
    int main(){
    	ll m;
    	init_unit();
    	while(~scanf("%d%lld",&n,&m)){
    		mat a;
    		for(int i=0;i<n;i++)
    			for(int j=0;j<n;j++)
    				scanf("%d",&a.m[i][j]);
    		a = pow_mat(a,m);
    		for(int i=0;i<n;i++){
    			printf("%d",a.m[i][0]);
    			for(int j=1;j<n;j++)
    				printf(" %d",a.m[i][j]);
    			printf("
    ");
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    Flask程序相关配置加载的三种方式
    Redis数据库在windows系统下的安装及使用
    Redis数据库介绍
    python中模块的制作
    4.ORM框架的查询
    3.ORM框架一对多的关系及使用
    2.ORM框架添加,修改,删除操作
    1.ORM介绍,基本配置及通过ORM框架创建表
    4.集合
    3.字典
  • 原文地址:https://www.cnblogs.com/WArobot/p/6793831.html
Copyright © 2011-2022 走看看