分治 取余问题

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.

诶嘿嘿

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值