• Luogu P1226 取余运算||快速幂(数论,分治)


     P1226 取余运算||快速幂

    题目描述

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

    输入输出格式

    输入格式:

    三个整数b,p,k.

    输出格式:

    输出“b^p mod k=s”

    s为运算结果

    输入输出样例

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

      这是一道很有趣的水题,如果知道公式。

      一般求解会溢出,导致答案错误。

      这里介绍取模的一个公式: a*b%k=(a%k)*(b%k)%k.

      在我们这道题中是b^p = (b^(p/2)%k) * (b^(p/2) %k)%k

      可以看出来运用的是分治的思维。那么一只分解到p == 1时就能够返回了。

      蛤?你说p等于奇数时候? 那就把那个奇数再挑出来呗。 b^p = b * b^(p/2) * b^(p/2)

     1 #include <cstdio>
     2 
     3 long long b, k;
     4 
     5 long long fff(long long p)
     6 {
     7     if(p == 1)    //p等于1时 b^p%k = b%k;
     8         return b%k;
     9     long long temp = fff(p/2); //分~
    10     temp = (temp*temp)%k;    //注意上面p==1时已经%k,所以这里不需要在括号里面%k
    11     if(p&1)    //如果p等于奇数
    12         temp = (temp*b)%k;
    13     return temp;
    14 }
    15 
    16 int main()
    17 {
    18     long long p;
    19     scanf("%lld%lld%lld", &b, &p, &k);
    20     long long ans = fff(p);
    21     printf("%lld^%lld mod %lld=%lld", b, p, k, ans);
    22     
    23     return 0;
    24 }
  • 相关阅读:
    中断子系统5_电流层处理
    太极拳透劲的原理推测
    OpenSSL命令---pkcs7
    初步分析美国科研项目申报项目
    OpenSSL命令---pkcs8
    C#中Hashtable的用法
    android 中 ViewPager 的平常用法 ViewPager+ Views
    打卡汇报
    OpenSSL命令---pkcs12
    卡卡游戏引擎之快速入门
  • 原文地址:https://www.cnblogs.com/yBaka/p/7388017.html
Copyright © 2020-2023  润新知