zoukankan      html  css  js  c++  java
  • P3390 【模板】矩阵快速幂

    题目

    分析

    矩阵快速幂模板题。

    注意的几个点:

    优化常数。

    还有记得矩阵的初始化需要memset(不知道为什么会wa)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    //#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    //char buf[1<<21],*p1=buf,*p2=buf;
    template <typename T>
    inline void read(T &x){
    	x=0;char ch=getchar();bool f=false;
    	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	x=f?-x:x;
    	return ;
    }
    template <typename T>
    inline void write(T x){
    	if(x<0) putchar('-'),x=-x;
    	if(x>9) write(x/10);
    	putchar(x%10^48);
    	return ;
    }
    #define ll long long
    const int N=105;
    const ll INF=1e12,MOD=1e9+7;
    const double eps=1e-6;
    #define PII pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    int n;
    ll m;
    inline ll inc(ll x,ll y){return x+y>=MOD?x+y-MOD:x+y;}
    struct Matrix{
    	ll a[N][N];
    	Matrix(){memset(a,0,sizeof(a));}
    	inline Matrix operator * (const Matrix &B)const{
    		Matrix C;
    		for(int i=1;i<=n;i++){
    			for(int k=1;k<=n;k++){
    				ll r=a[i][k];
    				for(int j=1;j<=n;j++) C.a[i][j]=(C.a[i][j]+r*B.a[k][j])%MOD;
    			}
    		}
    		return C;
    	}
    	inline Matrix operator + (const Matrix &B)const{
    		Matrix C;
    		for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) C.a[i][j]=a[i][j]+B.a[i][j];
    		return C;
    	}
    	inline void print(){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++) write(a[i][j]),putchar(' ');
    			putchar('
    ');
    		}
    		return ;
    	}
    };
    inline Matrix QuickPow(Matrix x,ll y){
    	Matrix res;
    	for(int i=1;i<=n;i++) res.a[i][i]=1;
    	while(y){
    		if(y&1) res=res*x;
    		x=x*x;
    		y>>=1;
    	}
    	return res;
    }
    signed main(){
    	read(n);read(m);
    	Matrix r;
    	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) read(r.a[i][j]);
    	Matrix res;
    	for(int i=1;i<=n;i++) res.a[i][i]=1;
    	while(m){
    		if(m&1) res=res*r;
    		r=r*r;
    		m>>=1;
    	}
    	res.print();
    	return 0;
    }
    
  • 相关阅读:
    Silverlight2 开发环境 安装程序顺序
    Java——IO流超详细总结
    【慢慢学Android】:2.SharedPreferences对数据的存储
    【慢慢学算法】:求最大公约数
    【慢慢学算法】:求较大素数 筛选法
    【慢慢学算法】:排名
    手把手教你将vim配置成一个C/C++的超级IDE
    【慢慢学算法】:特殊乘法
    【慢慢学算法】:qsort()与sort的用法(收藏)
    【慢慢学算法】:数字阶梯求和
  • 原文地址:https://www.cnblogs.com/Akmaey/p/15037020.html
Copyright © 2011-2022 走看看