快速幂和矩阵快速幂-模板
2015-05-19 20:36
369 查看
快速幂的思想就是减少相乘的次数,将原本n-1次的相乘减小到(lg(n))的复杂度;
a^b=(a^2)^(b/2)
这个式子由于/是整除,所以得分奇偶的不同情况,偶数时仍然成立,奇数时需要再乘上一个a;
所以快速幂就是将原本的以a为基本单位的连乘改成以a*a为单位的连乘;
代码:
矩阵的快速幂是在这个的思想的基础上的,对矩阵进行更新;
代码:
a^b=(a^2)^(b/2)
这个式子由于/是整除,所以得分奇偶的不同情况,偶数时仍然成立,奇数时需要再乘上一个a;
所以快速幂就是将原本的以a为基本单位的连乘改成以a*a为单位的连乘;
代码:
#include<iostream> #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll quickpow(ll a,ll n,ll mod)//计算的大多是要对mod; { int ans=1; while(n) { if(n&1) ans=ans*a%mod; a=a*a%mod; b/=2; } return ans; } int main() { int a,b,mod; cin>>a>>b>>mod; int ans=quickpow(a,b,mod); cout<<ans<<endl; return 0; }
矩阵的快速幂是在这个的思想的基础上的,对矩阵进行更新;
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define Max 10 using namespace std; struct Matrix { int n,m; int a[Max][Max]; Matrix operator * (Matrix b) { Matrix c; c.n=n; c.m=b.m; memset(c.a,0,sizeof(c.a)); for(int i=0;i<n;i++) { for(int j=0;j<b.m;j++) { for(int k=0;k<m;k++) { c.a[i][j]+=a[i][k]*b.a[k][j]; } } } return c; } }; Matrix quickpow(Matrix a,int n) { Matrix c; c.n=a.n; c.m=a.m; for(int i=0;i<c.n;i++) { for(int j=0;j<c.m;j++) c.a[i][j]=(i==j);//初始化为单位矩阵; } while(n) if(n&1) c=c*a; a=a*a; } return c; } int main() { Matrix a,b; scanf("%d%d",&a.n,&a.m); for(int i=0;i<a.n;i++) { for(int j=0;j<a.m;j++) { scanf("%d",&a.a[i][j]); } } b=quickpow(a,2); for(int i=0;i<a.n;i++) { for(int j=0;j<a.m;j++) printf("%d ",b.a[i][j]); printf("\n"); } return 0; }
相关文章推荐
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
- 深夜敲模板_1——快速幂 && 矩阵的快速幂
- Additions HNUST 1713(矩阵快速幂模板 )
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- hdoj 1575 Tr A(矩阵快速幂,模板题)
- 矩阵快速幂模板
- 矩阵快速幂 【模板】
- Covering HDU - 6185 矩阵快速幂 or杜教模板
- 整数的快速幂和矩阵的快速幂
- 矩阵快速幂模板
- Queuing(矩阵快速幂(递推and模板))
- Additions HNUST 1713(矩阵快速幂模板 )
- 个人模板 快速幂取模,矩阵快速幂,快速乘
- 矩阵快速幂模板
- HDU 1757 A Simple Math Problem(矩阵快速幂模板)
- [模板] - 矩阵快速幂
- 矩阵快速幂模板
- 矩阵快速幂模板