计算h个a的b次幂的和,然后对m取余。。。直接pow是不行的

查找《算法导论》后得到算法,太牛逼了

先将b转换成2进制,存放在一个数组bin里面
d<-1
for i=0 to k-1 k为bin中存放的个数
   d<-d*d mod m
   if bin[i]==1
      d<-d*a mod m
以上是a的b次幂的算法

#include <iostream>
#include 
<string>
#include 
<vector>
using namespace std;

vector
<int> bin,rev;

void GetBinary(long long int b)
{
    
long long int temp;
    
while (b)
    
{
        bin.push_back(b
%2);
        b
=b/2;
    }

    
for (int i=bin.size()-1;i>=0;i--)
    
{
        rev.push_back(bin[i]);
    }

}

int main()
{
    
int num;
    
long long int d,sum,h,m,a,b;
    scanf(
"%d",&num);
    
while (num--)
    
{
        sum
=0;
        scanf(
"%lld",&m);
        scanf(
"%lld",&h);
        
while (h--)
        
{
            scanf(
"%lld %lld",&a,&b);
            bin.clear();rev.clear();
            GetBinary(b);
            d
=1;
           
for(int index=0;index<(size_t)rev.size();index++)
           
{
               d
=(d*d)%m;
               
if (rev[index]==1)
                d
=(d*a)%m;
           }

           sum
+=d;
        }

        printf(
"%lld\n",sum%m);
    }

}