题目:
计算(A1^B1+A2^B2+ ... +AH^BH)mod M
M (1 <= M <= 45000)
H (1 <= H <= 45000)
INPUT:
第一行是组数
每组第一行是M,第二行是H,后面H行是两个数Ai,Bi
OUTPUT:
每行对应输出每组的答案
分析:
为了使中间结果不溢出,用快速幂的思路
B分解为∑ci*2^i(0<=i<=k,k=log(B+1))
实际上ci就对应B的二进制表示中的第i位,取出第i位,若为1,则操作A^(2^i),而A^(2^i)=A^(2^(i-1))*A^(2^(i-1))
所以操作的A^(2^(i-1))这一项可以累乘得到
再然后对每一项乘之后模M,每一个A^B算好之后,加上答案,再模M
似乎把B拆成∑ci*10^i(0<=i<=k,k=lg(B+1))也是一个思路,但是实现难度远高于快速幂哇
代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
ll m,h;
cin>>m>>h;
ll ans=0;
for(int i=1;i<=h;i++){
ll a,b;
cin>>a>>b;
ll ta=1%m;
for(;b;b>>=1){
if(b&1){
ta=ta*(a%m)%m;
}
a=a*(a%m)%m;
}
ans=(ans+ta)%m;
}
cout<<ans<<endl;
}
return 0;
}