矩阵快速幂
作用
矩阵快速幂可以用来加速递推公式。
举例
斐波那契数列有一个矩阵可以进行优化。
就像这个矩阵一样
1 | 1 |
---|---|
0 | 1 |
fn | 1*f(n-1) | 1*f(n-2) |
---|---|---|
f(n=1) | 1*f(n-1) | 0*f(n-2) |
例题
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;
}
新赛季的开始