矩阵快速幂

作用

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

举例

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

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;
}
新赛季的开始
原文地址:https://www.cnblogs.com/VagrantAC/p/12555056.html