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

    洛谷P1226就是快速幂的一个模板题:

    输入b,p,k;求b的k次方除以k的值。数据范围 ≤ 2^31;

    若按之前的方法用循环求 b^p的话,时间复杂度O(n),并且数据会很大,部分测试点

    就会超时;

    所以,就用到了快速幂:

    比如求 2^64   (2^32)^2  => ((2^16)^2)^2  =>……一直将指数  / 2  这样就

    将复杂度O(n)降到了O(log n),速度就会快很多。

    要做这个题 还要知道

    (a1*a2*a3*……*an) mod p

    =(a1 mod p * a2 mod p * a3 mod p * ……*an mod p) mod p;

    所以这个题就可以定义递归函数了:

    1 int ksm(int x,int y,int p)
    2 {
    3     if (y==0) return 1;
    4     int z = ksm(x,y/2,p);
    5     z = 1ll*z*z%p;
    6     if (y%2==1) z=1ll*z*x%p;
    7     return z;
    8 }

    其中 1ll 是将z强制类型转换 防止 z * z 太大,爆 int;

    完整代码:

     1 #include<iostream>
     2 using namespace std;
     3 int ksm(int x,int y,int p)
     4 {
     5     if (y==0) return 1;
     6     int z = ksm(x,y/2,p);
     7     z = 1ll*z*z%p;
     8     if (y%2==1) z=1ll*z*x%p;
     9     return z;
    10 }
    11 int main()
    12 {
    13     int b,p,k;
    14     cin>>b>>p>>k;
    15     cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k)%k;
    16     return 0;
    17 }
  • 相关阅读:
    VSCode使用笔记
    python调用C++
    ubuntu下编译C++程序
    使用swig在python中调用C++
    VSCode调试data层时自身的一个bug
    MNN配置
    金融业务中的命名惯例
    Clang的线程安全分析静态工具
    gdb命名记录
    开发小结-产品类
  • 原文地址:https://www.cnblogs.com/zkw666/p/12447512.html
Copyright © 2011-2022 走看看