快速幂运算
一.快速幂取模运算模板
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 }