【重走普及路】【分治】【经典算法】快速幂

题目描述

输入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
分治,即 将大问题拆分为小问题,分而治之,各个击破,然后在合并回来。

First:暴力解决不解释 O(n) 爆

    t:=b;
    for i:=2 to p do t:=(t*b) mod k;
Second:
因为a^b mod c=(a^2)^(b/2) mod c  (b mod 2=0);  

a^b mod c=((a^2)^(b div 2)*a) mod c (b mod 2=1)  
 所以可以在计算过程中不断地将底数平方、指数除以2,用另一个变量记录最终答案。

var t,b,p,k:int64;
begin
    readln(b,p,k);
    write(b,'^',p,' mod ',k,'=');
    b:=b mod k;
    t:=1;
    while p>0 do begin
        if p mod 2=1 then t:=t*b mod k;
        p:=p div 2;
        b:=(b*b) mod k;
    end;
    writeln(t);
end.
 
 

你可能感兴趣的:(重走普及路)