快速幂学习心得:
1、快速幂大致分为普通的快速幂,快速乘法,矩阵快速幂(point); 2、快速幂主要应用的是二进制,详细的见模板。 3、快速乘法,其实乘法就是多个数相加,当数据很大的时候加起来会非常的慢,这里可以用到快速幂的思想。详细见模板 4、主要的还是矩阵快速幂,矩阵快速幂可以将矩阵看作一个常数,思想不变,可以operater *,主要参考一下线性代数上的矩阵的乘法运算。普通快速幂:
mod 1e9+7;// a*b;const long long MOD = 1e9+7;long long q_pow(long long a,long long b){ long long sum=1; while(b) { if(b&1)//当b是奇数时 sum = (sum * a)%MOD; a = (a * a)%MOD; b>>=1; } return sum;}
乘法快速幂
mod1e9+7;//原理和上述的相同typedef long long ll;const long long MOD = 1e9+7;ll q_c(ll a,ll b){ ll sum=0; while(b) { if(b&1) sum = (sum + a)%MOD; a = (a + a)%MOD; b>>=1; }}
矩阵快速幂
//参考的bilibili上面一个大佬讲解快速幂的视频#includeconst int maxn = 150;const int MOD = 1e9+7;typedef long long ll;int n;int num;struct mat//使用结构体,返回时可以直接返回mat{ int m[maxn][maxn];} unit;//单位矩阵(主对角线上全是一,其他的全是0的矩阵)mat operator * (mat a,mat b)//对于惩罚重新定义{ ll x; mat c; for(int i=0; i >=1; } return unit ;}int main(){ mat aim; while(scanf("%d",&n)!=EOF)//必须要是n阶方正才可以 { scanf("%d",&num);//num个矩阵相乘 for(int i=0; i