zoukankan      html  css  js  c++  java
  • 快速幂运算

    一.快速幂取模运算模板

     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 }
  • 相关阅读:
    数组splice用法
    opacity 适配Ie
    直接贴页面,页面衔接处总会有一像素的间隔
    <script src='url'</script>显示问题
    弹出层
    CF789A. Anastasia and pebbles
    CF789C. Functions again
    HDU2161 Primes
    UVA11752 The Super Powers
    UVA11827 Maximum GCD
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/13587721.html
Copyright © 2011-2022 走看看