快速幂乘取模


#include <cstdio>
 #include <cstdlib>
 #include <cstring>
using namespace std;
 long long mul(long long a, long long b, long long mod) //快速计算 (a*b) % mod
{
     long long ans = 0;  // 初始化
      while (b)                //根据b的每一位看加不加当前a
       {
           if (b & 1)           //如果当前位为1
            {
                b--;
                ans = (ans + a) % mod;   //ans+=a
           }
        b /= 2;                         //b向前移位
           a = (a + a) % mod;          //更新a
  

        }
      return ans;
  }
 long long pow_pow(long long a, long long b, long long mod) {
  long long ans = 0;
  while (b) {
   if (b & 1) {
    ans = mul(ans, a, mod);
   }
   b = b / 2;
   a = pow_pow(a, a, mod);
  }
  return ans;
 }
 int main()
 {
      int t;
      scanf("%d", &t);
      while (t--)
       {
           long long q, p;
           scanf("%I64d %I64d", &q, &p);
           long long a = q - 1;
           long long b = q - 2;
           long long ans;
     ans = mul(a / 2, b, p);
          printf("%I64d\n", ans);
       }
      return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值