分治 取余问题

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.

诶嘿嘿

你可能感兴趣的:(分治 取余问题)