快速幂的思想就是减少相乘的次数,将原本n-1次的相乘减小到(lg(n))的复杂度;
a^b=(a^2)^(b/2)
这个式子由于/是整除,所以得分奇偶的不同情况,偶数时仍然成立,奇数时需要再乘上一个a;
所以快速幂就是将原本的以a为基本单位的连乘改成以a*a为单位的连乘;
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int quickpow(int a,int b,int mod)//计算的大多是要对mod; 6 { 7 int ans=1; 8 a%=mod; 9 while(b>1) 10 { 11 if(b%2==1) 12 a*=a; 13 a=(a*a)%mod; 14 b/=2; 15 a%=mod; 16 } 17 return a; 18 } 19 int main() 20 { 21 int a,b,mod; 22 cin>>a>>b>>mod; 23 int ans=quickpow(a,b,mod); 24 cout<<ans<<endl; 25 return 0; 26 }
矩阵的快速幂是在这个的思想的基础上的,对矩阵进行更新;
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define Max 10 6 using namespace std; 7 struct Matrix 8 { 9 int n,m; 10 int a[Max][Max]; 11 Matrix operator * (Matrix b) 12 { 13 Matrix c; 14 c.n=n; 15 c.m=b.m; 16 memset(c.a,0,sizeof(c.a)); 17 for(int i=0;i<n;i++) 18 { 19 for(int j=0;j<b.m;j++) 20 { 21 for(int k=0;k<m;k++) 22 { 23 c.a[i][j]+=a[i][k]*b.a[k][j]; 24 } 25 } 26 } 27 return c; 28 } 29 }; 30 Matrix quickpow(Matrix a,int k) 31 { 32 Matrix c; 33 c.n=a.n; 34 c.m=a.m; 35 for(int i=0;i<c.n;i++) 36 { 37 for(int j=0;j<c.m;j++) 38 c.a[i][j]=(i==j);//初始化为单位矩阵; 39 } 40 for(;k;k/=2) 41 { 42 if(k%2==1) 43 c=c*a; 44 a=a*a; 45 } 46 return c; 47 } 48 int main() 49 { 50 Matrix a,b; 51 scanf("%d%d",&a.n,&a.m); 52 for(int i=0;i<a.n;i++) 53 { 54 for(int j=0;j<a.m;j++) 55 { 56 scanf("%d",&a.a[i][j]); 57 } 58 } 59 b=quickpow(a,2); 60 for(int i=0;i<a.n;i++) 61 { 62 for(int j=0;j<a.m;j++) 63 printf("%d ",b.a[i][j]); 64 printf("\n"); 65 } 66 return 0; 67 }
时间: 2024-10-05 04:54:57