快速幂:
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power % 2 == 1) {
result = result * base % 1000;
}
power = power / 2;
base = (base * base) % 1000;
}
return result;
}
矩阵快速幂:
将快速幂中的res改为单位矩阵,两个乘法改为矩阵乘法即可。
unsigned long long fun(unsigned long long B[2][2],unsigned long long power){
unsigned long long E[2][2]={{1,0},{0,1}};
while(power>0){
if(power%2==1)
mul(E,B);
mul(B,B);
power/=2;
}
return E[0][1];
}
下面是用矩阵快速幂的一个应用:斐波那契数列
求解该数列的第n项,结果对998244353取模。
提示:矩阵快速幂,unsigned long long的最大值:1844674407370955161(1.8e18)
输入格式:
输入一个正整数n (1<=n<=1e18)。
输出格式:
输出一个数,数列的第n项
输入样例2:
3
输出样例2:
2
#include<stdio.h>
void mul(unsigned long long A[2][2],unsigned long long B[2][2]){
unsigned long long C[2][2],D[2][2],R[2][2]={0};
int i,j,k;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
C[i][j]=A[i][j];
D[i][j]=B[i][j];
}
}
for(i=0;i<2;i++){
for(j=0;j<2;j++){
for(k=0;k<2;k++){
R[i][j]=(R[i][j]+C[i][k]*D[k][j])%998244353;
}
}
}
for(i=0;i<2;i++){
for(j=0;j<2;j++){
A[i][j]=R[i][j];
}
}
}
unsigned long long fun(unsigned long long B[2][2],unsigned long long power){
unsigned long long E[2][2]={{1,0},{0,1}};
while(power>0){
if(power%2==1)
mul(E,B);
mul(B,B);
power/=2;
}
return E[0][1];
}
int main(){
unsigned long long B[2][2]={{1,1},{1,0}};
unsigned long long power;
scanf("%lld",&power);
printf("%lld",fun(B,power));
return 0;
}