快速幂运算

一.快速幂取模运算模板

 1 #include <iostream>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 ll mod_pow(ll x,ll n,ll mod){
 6     ll res=1;
 7     while(n>0){
 8         if(n&1) res=res*x%mod;      //如果二进制最低位为1,则乘上x^(2^i)
 9         x=x*x%mod;                  //将x平方
10         n>>=1;
11     }
12     return res;
13 }
14 
15 ll mod_pow_1(ll x,ll n,ll mod){
16    if(n==0) return 1;
17    ll res=mod_pow_1(x*x%mod,n/2,mod);
18    if(n&1)  res=res*x%mod;
19    return res;
20 }
21 
22 int main(){
23     int x,n,mod;
24     cin>>x>>n>>mod;
25     cout<<mod_pow(x,n,mod);
26     return 0;  
27 }

二.快速幂运用蓝桥学苑讲解

 1 /**
 2  * 第九届蓝桥杯大赛个人赛总决赛真题2018a1
 3  题目描述:
 4 标题:分数
 5 
 6 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + .... 
 7 每项是前一项的一半,如果一共有20项,
 8 求这个和是多少,结果用分数表示出来。
 9 类似:
10 3/2
11 当然,这只是加了前2项而已。分子分母要求互质。
12 
13 注意:
14 需要提交的是已经约分过的分数,中间任何位置不能含有空格。
15 请不要填写任何多余的文字或符号。
16 
17 输出:1048575/524288
18 
19 算法分析:
20 2^10的指数10用二进制表示就是1010
21 也就是1*2^3+0*2^2+1*2^1+0*2^0
22 那么对应的快速幂就是X^8+X^4+X^2+X^0
23 提取出来就是1对应的数字有,0则没有;
24 2^8+2^2=2^10
25 
26 运算符m&n的结果是求出m/n的剩余数据个数(余数)
27 运算符m&~n的结果是求出剩余数据的起始位置
28 */ 
29 #include <bits/stdc++.h>
30 using namespace std;
31 //快速幂模板x^n
32 long pow_2(int n){
33     long x=2;
34     long ans=1;
35     while(n>0){
36         if(n&1)       //检测二进制数n的最后一位 ,并且判断这一位是否需要跳过   
37             ans*=x;
38         n>>=1;        //右移一位,把刚处理的n的最后一位去掉
39         x=x*x;        //推算乘积,x^2----->x^4----->x^8------>x^16......
40     }
41     return ans;
42 }
43 //最大公约数:可以直接用c++的内置函数std::__gcd(a,b)
44 int gcd(long a,long b){
45     //return b==0?a:gcd(b,a%b);
46     if(b==0)    return a;
47     return gcd(b,a%b);
48 }
49 //最小共倍数
50 int lcm(int a,int b){
51     return a/gcd(a,b)*b;
52 }
53 int main(){
54     //方法一
55     cout<<gcd(pow_2(20)-1,pow_2(19))<<endl;
56     cout<<pow_2(20)-1<<"/"<<pow_2(19)<<endl;
57     //内置函数
58     cout<<__gcd(pow_2(20)-1,pow_2(19))<<endl;
59   
60     //方法2:
61     long a=(1<<19);
62     long b=(a<<1)-1;
63     cout<<b<<"/"<<a<<endl;
64 }

 三.矩阵快速幂模板

 1 /*
 2 *给定m*m的矩阵A,求A的n次幂A^n
 3 *定义矩阵结构体
 4 */
 5 
 6 const int MAXN=1e5;         //矩阵的阶
 7 const int MOD=1e4;          //定义模
 8 struct Matrix{              //定义矩阵
 9     int m[MAXN][MAXN];
10     Matrix(){
11         memset(m,0,sizeof(m));
12     }
13 };
14 Matrix Multi(Matrix a,Matrix b){    //矩阵的乘法
15     Matrix res;
16     for(int i=0;i<MAXN;i++){
17         for(int j=0;j<MAXN;j++){
18             for(int k=0;k<MAXN;k++){
19                 res.m[i][j]=(res.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
20             }
21         }
22     }
23     return res;
24 }
25 //快速幂
26 Matrix fastm(Matrix a,int n){
27     Matrix res;
28     for(int i=0;i<MAXN;i++){
29         res.m[i][i]=1;          //初始化单位矩阵,相当于int res=1;
30     }
31     while(n){
32         if(n&1)
33             res=Multi(res,a);
34         a=Multi(a,a);
35         n>>=1;
36     }
37     return res;
38 }

 

posted on 2020-08-31 08:40  恒晨  阅读(183)  评论(0编辑  收藏  举报

导航