SSL 1422
洛谷 P1226 取余运算||快速幂
题目大意
输入b,p,k的值,求b^p mod k 的值
b,p,k*k都是长整形。
题目分析
看着很简单,但是数据和时间是个不能逆转的问题,所以采用分治解。
有一条公式:b^p=b^p div 2*b^p div 2+余数所求,即可以解题。
从div 2可以看出,可以用分治二进制记录该乘的点。
唯一的麻烦就是除数为单数的情况,所以数组记录每次除数为单数的地方,就可以求出答案啦!
程序
var
b,p,k,s,s1,i,j:longint;
a:array[1..100]of longint;
procedure pre(n:longint);
begin
if n=0 then exit;
inc(i);
a[i]:=n mod 2;
pre(n div 2);
end;
begin
readln(b,p,k);
i:=0;
pre(p);
s:=1;
for j:=i downto 1 do
begin
s1:=s*s mod k;
if a[j]=1 then s:=b mod k*s1 mod k
else s:=s1;
end;
writeln(b,'^',p,' mod ',k,'=',s);
end.
诶嘿嘿