快速幂:a*b%p和a^b%p

快速幂:a*b%p和a^b%p**

理解:所谓快速幂,就是解决大数运算的一种思想,更形象的理解为:位运算,而这个位是按二进制来看的位,比如 8 = 2^3 1+2^ 2 0+2^ 10+2^00;即按二进制表示为:1000
还可以理解 7634%5 =(76%5)*(34%5)%5 只是我们将其用了二进制来减少b,也就是循环次数,从而降低复杂度

【a^b%p】
在这里插入代码片

   long long int a,b,p;
   scanf("%lld %lld %lld",&a,&b,&p);
    long long int ans=1;
   while(b)
   {
       if(b%2==1) ans=ans*a%p;//如果是2的倍数,就把多的那个a乘到ans里
        a=a*a%p;
        b=b/2;//移到下一位,虽然b/2,但是我们的ans同时也再乘了个a,这里的b指的是乘     a的个数
   }
   printf("%lld",ans%p);

【a*b%p】

  long long int a,b,p,ans = 0;
    scanf("%lld\n%lld\n%lld",&a,&b,&p);
    while(b)
   {
       if(b%2==1) ans=(ans+a)%p;
       a=a*2%p;
       b/=2;
   }
   printf("%lld",ans);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值