• 我会快速幂了!!!!!!!!!


    题目描述

    给你三个整数 b,p,k,求 b^p mod k

    输入格式

    一行三个整数 b,p,k

    输出格式

    输出 b^p mod k=s

    s 为运算结果

    输入输出样例

    输入 #1
    2 10 9
    
    输出 #1
    2^10 mod 9=7
    

    说明/提示

    【样例解释】
    2^{10} = 10241024 mod 9 = 7

    【数据范围】
    对于 100%的数据,0b,p,k<2^31

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    int ksm(int,int,int);
    int main()
    {
    int b,p,k;
    cin>>b>>p>>k;
    cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k);
    return 0;
    }
    int ksm(int x,int y,int p)
    {
    if(y==0) return 1%p;//任何数的0次方都是1,所以直接返回1%p
    int z=ksm(x,y/2,p);//定义一个新变量,让它等于开方后的数。这是一种二分的思想,比如本题样例:2^10=2^5*2^5=(2^2*2^2*2)*(2^2*2^2*2)......这样一直分下去,复杂度就是logn,因为每一次操作相当于开根,这样就可以大大降低复杂度。如果不用快速幂,那么就要一个一个乘下去,复杂度就是n。此题的范围是10^9,如果真的取到10^9,那么就会炸裂(计算机速度一般在3*10^8~8*10^8之间,为了保险一般只要时间复杂度在10^8以内就能保证在1s内跑出来)

    z=1ll*z*z%p;//乘以1ll就相当于强制类型转化,将z从int转化为long long
    if(y%2==1) z=1ll*z*x%p;//如果不能整除2,那么就要再多乘上一个x,只要乘logn次
    return z;
    }

  • 相关阅读:
    重要:VC DLL编程
    VC++程序员如何做好界面
    复习二叉搜索树作的几道题
    eclipse JAVA反编译
    秒,毫秒,微秒,纳秒,皮秒,飞秒
    redis实现tomcat集群session共享
    redis启用持久化
    Spring
    Spring scope
    FastJSON 使用
  • 原文地址:https://www.cnblogs.com/57xmz/p/12444677.html
Copyright © 2020-2023  润新知