快速幂一般都是用来快速递推某个矩阵的n次幂的,一些题目的解法可以通过找规律递推,构建递推矩阵,就可以进行高次计算。
模板自用:
#include <iostream> #include <vector> using namespace std; vector<vector<unsigned long long>> mul(vector<vector<unsigned long long>> a,vector<vector<unsigned long long>> b){ int n=a.size(); int s=a[0].size(); int m=b[0].size(); vector<vector<unsigned long long>> c(n,vector<unsigned long long>(m,0)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ for(int k=0;k<s;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } return c; } vector<vector<unsigned long long>> qmi1(vector<vector<unsigned long long>> a,int k){ int n=a.size(); vector<vector<unsigned long long>> res(n,vector<unsigned long long>(n,0)); for(int i=0;i<n;i++){ res[i][i]=1; } while(k){ if(k&1)res=mul(res,a); a=mul(a,a); k>>=1; } return res; } unsigned long long qmi2(unsigned long long a,unsigned long long k){ unsigned long long res=1; while(k){ if(k&1)res=res*1ull*a; a=a*1ull*a; k>>=1; } return res; } void out(vector<vector<unsigned long long>> a){ for(int i=0;i<a.size();i++){ for(int j=0;j<a[0].size();j++){ cout<<a[i][j]<<" "; } cout<<endl; } }
记录一次快速幂
原文:https://www.cnblogs.com/kstranger/p/13390593.html