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;
    }
    
  • 相关阅读:
    inline-block 文字与图片不对齐
    js去除数组重复项
    react2
    kfaka windows安装
    sigar 监控服务器硬件信息
    Disruptor
    Servlet 3特性:异步Servlet
    jvmtop 监控
    eclipse如何debug调试jdk源码
    一致性hash算法
  • 原文地址:https://www.cnblogs.com/Akmaey/p/15037020.html
Copyright © 2011-2022 走看看