您的位置:首页 > 其它

快速幂乘取模

2016-04-17 14:34 197 查看
#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;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学