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

    题目描述

    输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。

    输入输出格式

    输入格式:

    三个整数b,p,k.

    输出格式:

    输出“b^p mod k=s”

    s为运算结果

    思路:

    显然取余和乘法谁都会

    关键在于快速

    我们知道乘方有一个性质

    x^n=(x^2)^(n/2)

    这样我们就能通过二分使时间复杂度降到log级别

    你可能会说,n%2==1怎么办??

    和简单,再定义一个变量作为暂存器,乘一下x

    这时候又有另一个定理

    x^n=x^(n-1)*x

    所以n可以减一

    最后将暂存器和x乘起来即可

    代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int  a,b,s;
    int res=1;
    int pw(int j,int k)
    {
        if(k==0)
        {
            res=res%s;
            return res;
        }
        j=j%s;
        if(k%2==1)
        {
            res=res*j;
            res=res%s;
            k--;
            pw(j,k);
        }
        else
        {
            k=k/2;
            j=j*j;
            pw(j,k);
        }    
    }
    int main()
    {
        cin>>a>>b>>s;
        long long x=1;
        x=pw(a,b);
        cout<<a<<"^"<<b<<" mod "<<s<<"="<<x;
    }
  • 相关阅读:
    JAVA-容器(5)-Map
    JAVA-容器(4)-Set
    数据脏读-非重复读-幻读
    JAVA-容器(3)-List
    JAVA-容器(2)-Collection
    JAVA-容器(1)
    Arrays排序
    JAVA-虚拟机(3)-调优
    zip解压缩
    rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
  • 原文地址:https://www.cnblogs.com/ztz11/p/8973023.html
Copyright © 2011-2022 走看看