1.快速幂
例如求a11可以将11化为二进制为1011
从后往前遍历遇到0则乘a0
a11=(a1) * (a2) * (a0) * (a8)
void power(int n,int x){
int ans=1;
while(n){
if(n&1){
ans=ans*x;
}
x*=x;
n>>=1;
}
}
2.矩阵快速幂
//利用结构体进行操作
struct Matrix{
int jz[maxn][maxn];
}ans,res;
//计算矩阵乘法的函数,参数是矩阵A和B
//还有代表n阶方阵的n
Matrix Mul(Matrix A,Matrix B,int n){
Matrix tmp;//定义一个临时的矩阵,存放A*B的结果
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.jz[i][j]=0;
}
}
//矩阵乘法
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
tmp.jz[i][j]+=A.jz[i][k]*B.jz[k][j];
}
}
}
return tmp;
}
//快速幂函数
void power(int N,int n) {
//ans初始化为单位矩阵
//因为 A*E=A;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++){
if(i==j){
ans.jz[i][j]=1;
}
else{
ans.jz[i][j]=0;
}
}
}
//快速幂基本操作
while(N){
if(N&1){
ans=Mul(ans,res,n);
}
res=Mul(res,res,n);
N>>=1;
}
}