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

    问题 A: a^b

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 84  解决: 27
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9

    输入

    三个用空格隔开的整数a,b和p。

    输出

    一个整数,表示a^b mod p的值。

    样例输入

    2 3 9
    

    样例输出

    8


    #include <iostream>
    
    using namespace std;
    
    long long mypow(long long a,long long b,long long p)
    {
    
        long long ans = 1;
        long long base = a;
    
        while(b!=0)
        {
            if(b%2!=0)
            {
                ans*=base;
                ans%=p;
            }
            base*=base;
            base%=p;
            b/=2;
        }
        return ans;
    }
    
    int main()
    {
        long long int a,b,p;
        cin>>a>>b>>p;
    
        cout<<mypow(a,b,p)%p;
        return 0;
    }

    以下转载于 https://www.cnblogs.com/lca1826/p/6748372.html

    快速幂

    b==11时,a^11=a^(2^0+2^1+2^3)

    11的二进制是101111 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^(2^0)*a^(2^1)*a^(2^3) ,看出来快的多了吧原来算11次,现在算三次.

    由于是二进制,很自然地想到用位运算这个强大的工具: &  >> &运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位,不多说了,先放代码再解释。

    <1>.二进制写法

    1    0   1    1

    a^8 *   a^2 * a^1 = a^11

    int poww(int a,int b)

    {      

    int ans=1,base=a; 

           while(b!=0)

    {         

    if(b&1!=0)  //b的最后一位不为0

    {

    ans*=base; 

    }

               base*=base; 

              b>>=1; 

         }

          return ans;

     }

    b==11为例,b=>1011,二进制从右向左算,但乘出来的顺序是 a^(2^0) * a^(2^1)  * a^(2^3),是从左向右的。我们不断的让base*=base目的即是累乘,以便随时对ans做出贡献。

      其中要理解base*=base这一步,看:::base*base==base^2,下一步再乘,就是base^2*base^2==base^4,然后同理  base^4 * base4 = base^8 ,,,,, see?是不是做到了base-->base^2-->base^4-->base^8-->base^16-->base^32.......指数正是 2^i 啊,再看上面的例子,a¹¹ =  a^(2^0) * a^(2^1) * a^(2^3),这三项是不是完美解决了,,嗯,快速幂就是这样。

     

    <2>.一般写法

    long long ksm(long long a,long long b) //快速幂ab{

        long long ans=1;

        while(b>0)

        {

            if(b%2==1)ans*=a,ans%=mod;

            a*=a;

            a%=mod;

            b/=2;

        }

        return ans;

    }

  • 相关阅读:
    ABAP 程序中的类 沧海
    ABAP类的方法(转载) 沧海
    More than 100 ABAP Interview Faq's(2) 沧海
    SAP and ABAP Memory总结 沧海
    ABAP Frequently Asked Question 沧海
    ABAP System Reports(Additional functions) 沧海
    ABAP Questions Commonly Asked 1 沧海
    ABAP Tips and Tricks 沧海
    ABAP System Fields 沧海
    ABAP 面试问题及答案(一):数据库更新及更改 SAP Standard (转) 沧海
  • 原文地址:https://www.cnblogs.com/hao-tian/p/9259929.html
Copyright © 2011-2022 走看看