其他分享
首页 > 其他分享> > 倍增总结

倍增总结

作者:互联网

日期: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