题意:给定A1...AH,B1...BH以及整数M,求(A1^B1+A2^B2+ ... +AH^BH)mod M。
思路:快速幂。原理为,将指数转换成二进制数。例如:11的二进制是1011。11 = 2^3×1 + 2^2×0 + 2^1×1 + 2^0×1。因此,我们将a^11转化为算a^1*a^2*a^8
#include <stdio.h>
#include <string.h>
int m,T;
int p(int a,int b){//return a^b%m
int r = 1,base = a;
while(b){
if(1&b)
r = r*base%m;
base = (base%m)*(base%m)%m;//随时注意乘法可能越界,要取模
b /= 2;
}
return r;
}
int main(){
freopen("a.txt","r",stdin);
scanf("%d",&T);
while(T--){
int a,b,num,sum=0;
scanf("%d %d",&m,&num);
while(num--){
scanf("%d %d",&a,&b);
sum += p(a,b);
sum %= m;
}
printf("%d\n",sum);
}
return 0;
}
一开始用递归写的快速幂,提交RE。递归的写法如下:
int p(int a,int b){
int i;
if(b==1)
return a%m;
i = p(a,b/2);
i = (i%m)*(i%m)%m;
if(b&1)
i = i*(a%m)%m;
return i;
}