1730: 取余运算(mod)

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:28 解决:19

题目描述


【问题描述】
       输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整形数。

【算法分析】
      本题主要的难点在于数据规模很大(b,p都是长整型数),对于b^p显然不能死算,
    那样的话时间复杂度和编程复杂度都很大。
       下面先介绍一个原理:A*B%K = (A%K )*(B% K )%K。
    显然有了这个原理,就可以把较大的幂分解成较小的,因而免去高精度计算等复杂过程。
    那么怎样分解最有效呢? 
         显然对于任何一个自然数P,有P=2 * P/2 + P%2,如19=2 * 19/2 + 19%2=2*9+1,
    利用上述原理就可以把B的19次方除以K的余数转换为求B的9次方除以K的余数,
即B^19=B^(2*9+1)=B*(B^9)*(B^9),再进一步分解下去就不难求得整个问题的解。

样例输入 复制

2 10 9 

       

样例输出 复制

2^10 mod 9=7