ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

倍增总结

2022-05-20 16:32:52  阅读:159  来源: 互联网

标签:总结 return matrix int d% long 倍增 105


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有