倍增总结
作者:互联网
日期:2022年5月20日
注:本博客仅供参考
概念
倍增,顾名思义,每次增加一倍。展开来说,就是每次根据已经得到的信息,将考虑的范围增加一倍, 从而加速操作。
应用
倍增的应用主要是三个方面:快速幂、线性(RMQ问题)、树(LCA问题)。
代码实现
快速幂及其应用
【模板】快速幂(P1226)
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long a; 4 int b,p; 5 int fast(long long a,int b,int p){ 6 long long s=1%p; 7 while(b) 8 { 9 if(b&1) 10 { 11 s=(s*a)%p; 12 } 13 a=(a*a)%p; 14 b=b>>1; 15 } 16 return s; 17 } 18 int main(){ 19 scanf("%lld%d%d",&a,&b,&p); 20 printf("%d^%d mod %d=%d",a,b,p,fast(a,b,p)); 21 return 0; 22 }
越狱(P3197)
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long n,sum1=0,sum2=0; 4 long long m; 5 int p=100003; 6 int fast(long long a,long long b,int c){ 7 long long s=1%c; 8 while(b) 9 { 10 if(b&1) 11 { 12 s=(s*a)%c; 13 } 14 a=(a*a)%c; 15 b=b>>1; 16 } 17 return s; 18 } 19 int main(){ 20 scanf("%d%lld",&m,&n); 21 sum1=fast(m,n,p); 22 sum2=m*fast(m-1,n-1,p)%p; 23 printf("%d",(sum1-sum2+p)%p); 24 return 0; 25 }
【模板】快速矩阵幂(P3390)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int P=1e9+7; 4 int n; 5 long long K; 6 struct matrix{ 7 long long a[105][105]; 8 }; 9 matrix operator *(matrix A,matrix B){ 10 matrix C; 11 memset(C.a,0,sizeof(C.a)); 12 for(int i=1;i<=n;++i) 13 { 14 for(int j=1;j<=n;++j) 15 { 16 for(int k=1;k<=n;++k) 17 { 18 C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%P; 19 } 20 } 21 } 22 return C; 23 } 24 matrix fast(matrix A,long long b){ 25 matrix S=A; 26 --b; 27 while(b) 28 { 29 if(b&1) 30 { 31 S=(S*A); 32 } 33 A=A*A; 34 b=b>>1; 35 } 36 return S; 37 } 38 matrix A; 39 int main(){ 40 scanf("%d%lld",&n,&K); 41 for(int i=1;i<=n;++i) 42 { 43 for(int j=1;j<=n;++j) 44 { 45 scanf("%d",&A.a[i][j]); 46 } 47 } 48 matrix C=fast(A,K); 49 for(int i=1;i<=n;++i) 50 { 51 for(int j=1;j<=n;++j) 52 { 53 printf("%lld ",C.a[i][j]); 54 } 55 printf("\n"); 56 } 57 return 0; 58 }
斐波那契数列(P1962)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int P=1e9+7; 4 int n; 5 long long K; 6 struct matrix{ 7 long long a[105][105]; 8 }; 9 matrix operator *(matrix A,matrix B){ 10 matrix C; 11 memset(C.a,0,sizeof(C.a)); 12 for(int i=1;i<=n;++i) 13 { 14 for(int j=1;j<=n;++j) 15 { 16 for(int k=1;k<=n;++k) 17 { 18 C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%P; 19 } 20 } 21 } 22 return C; 23 } 24 matrix fast(matrix A,long long b){ 25 matrix S=A; 26 --b; 27 while(b) 28 { 29 if(b&1) 30 { 31 S=(S*A); 32 } 33 A=A*A; 34 b=b>>1; 35 } 36 return S; 37 } 38 matrix A; 39 int main(){ 40 scanf("%d%lld",&n,&K); 41 for(int i=1;i<=n;++i) 42 { 43 for(int j=1;j<=n;++j) 44 { 45 scanf("%d",&A.a[i][j]); 46 } 47 } 48 matrix C=fast(A,K); 49 for(int i=1;i<=n;++i) 50 { 51 for(int j=1;j<=n;++j) 52 { 53 printf("%lld ",C.a[i][j]); 54 } 55 printf("\n"); 56 } 57 return 0; 58 }
【模板】矩阵加速(数列)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int P=1e9+7; 4 int n; 5 long long K; 6 struct matrix{ 7 long long a[105][105]; 8 }; 9 matrix operator *(matrix A,matrix B){ 10 matrix C; 11 memset(C.a,0,sizeof(C.a)); 12 for(int i=1;i<=n;++i) 13 { 14 for(int j=1;j<=n;++j) 15 { 16 for(int k=1;k<=n;++k) 17 { 18 C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%P; 19 } 20 } 21 } 22 return C; 23 } 24 matrix fast(matrix A,long long b){ 25 matrix S=A; 26 --b; 27 while(b) 28 { 29 if(b&1) 30 { 31 S=(S*A); 32 } 33 A=A*A; 34 b=b>>1; 35 } 36 return S; 37 } 38 matrix A; 39 int main(){ 40 scanf("%d%lld",&n,&K); 41 for(int i=1;i<=n;++i) 42 { 43 for(int j=1;j<=n;++j) 44 { 45 scanf("%d",&A.a[i][j]); 46 } 47 } 48 matrix C=fast(A,K); 49 for(int i=1;i<=n;++i) 50 { 51 for(int j=1;j<=n;++j) 52 { 53 printf("%lld ",C.a[i][j]); 54 } 55 printf("\n"); 56 } 57 return 0; 58 }
标签:总结,return,matrix,int,d%,long,倍增,105 来源: https://www.cnblogs.com/PlayerSS05/p/16292729.html