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

    作用

    矩阵快速幂可以用来加速递推公式。

    举例

    斐波那契数列有一个矩阵可以进行优化。
    就像这个矩阵一样

    1 1
    0 1
    fn 1*f(n-1) 1*f(n-2)
    f(n=1) 1*f(n-1) 0*f(n-2)

    例题

    洛谷P2044

    X(n+1) = a * Xn + c

    比较特殊的项是 Xn 和 c

    Xn a * X(n-1) 1 * c
    c 0 * X(n-1) 1 * c

    得出的矩阵为

    a 1
    0 1
    AC-Code
    #include <cstdio>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    ll step[2][2];
    inline void Init(){
        ios::sync_with_stdio(false);
        cin.tie(0);
    }
    inline ll multi(ll a,ll b,ll mod){
        ll ret=0;
        while(b){
        	if(b&1){
    	    ret=(ret+a)%mod;
    	}
    	b>>=1;
    	a<<=1;
    	a%=mod;
        }
        return ret;
    }
    inline ll poww(ll x,ll b,ll c,ll mod){
        ll ret[2]={x,c};
        while(b>0){
    	if(b&1){
    	    ll t[2]={0};
    	    for(int i=0;i<2;++i){
    	    	for(int j=0;j<2;++j){
    		    t[i]+=multi(ret[j],step[i][j],mod);
    		    t[i]%=mod;
    		}
    	    }
    	    for(int i=0;i<2;++i){
    	    	ret[i]=t[i];
    	    }
    	}
    	b>>=1;
    	ll temp[2][2]={0};
        	for(int i=0;i<2;++i){
    	    for(int j=0;j<2;++j){
    		for(int k=0;k<2;++k){
    		    temp[i][j]+=multi(step[i][k],step[k][j],mod);
    		    temp[i][j]%=mod;
    		}
    	    }
    	}
        	for(int i=0;i<2;++i){
    	    for(int j=0;j<2;++j){
    		step[i][j]=temp[i][j];
                }
    	}	    
        }
        return ret[0];
    }
    int main(){
        Init();
        ll m,a,c,x,n,g;
        cin>>m>>a>>c>>x>>n>>g;
        step[0][0]=a;
        step[0][1]=1;
        step[1][0]=0;
        step[1][1]=1;
        ll k=poww(x,n,c,m);
        cout<<k%g<<endl;
        return 0;
    }
    
    新赛季的开始
  • 相关阅读:
    第5周进度条
    《掌握需求过程》阅读笔记02
    第3周进度条
    《掌握需求过程》阅读笔记01
    问题账户需求分析
    2016年秋季个人阅读计划
    Arrays.sort解析
    算法排序
    Oracl Over函数
    Maven初步
  • 原文地址:https://www.cnblogs.com/VagrantAC/p/12555056.html
Copyright © 2011-2022 走看看