http://poj.org/problem?id=1995
以这道题来分析一下快速幂取模
a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能
利用公式a*b%c=((a%c)*b)%c
每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化
由此可以用快速幂算法优化:
http://www.cnblogs.com/qlky/p/5020402.html
再结合取模公式:
(a + b) % p = (a % p + b % p) % p
http://www.cnblogs.com/qlky/p/5020632.html
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 long long mod(long long a,long long b,long long m) 10 { 11 long long r =1,base = a; 12 while(b!=0) 13 { 14 if(b&1) 15 r= r*base%m; 16 base= base*base%m; 17 b>>=1; 18 } 19 return r; 20 } 21 22 int main() 23 { 24 long long t,n,m,i; 25 long long sum = 0; 26 scanf("%lld",&t); 27 while (t--) 28 { 29 scanf("%lld%lld",&m,&n); 30 31 long long a,b; 32 scanf("%lld%lld",&a,&b); 33 sum = mod(a,b,m); 34 35 for(i = 0;i<n-1;i++) 36 { 37 scanf("%lld%lld",&a,&b); 38 sum+=mod(a,b,m); 39 sum%=m; 40 } 41 printf("%lld ",sum); 42 43 } 44 return 0; 45 }