(A1B1+A2B2+ ... +AHBH)mod M.
高次幂取模
乘方取模问题 计算x的值, a^n=x(mod(m))。
显然 a^n = a*(a^n-1(mod(m)))(mod(m)).
ans = 1;
for(int i = 0 ; i < n ; i++)
{
ans *= a;
ans %=m;
}
最简单的代码如上。
这个算法的时间复杂度是O(n),假如给的n很大,一定会超时的。
下面就介绍一种快速幂算法
对指数n进行二分,那么显然有
a^n%m = (a^n/2)^2%m (n为偶数) (a^n/2)^2%m*a%m (n为奇数)。
这样就把时间复杂度从O(n)降到了O(logn)了
代码如下,代码适合m不超过int 的范围
#include<cstdio>
#include<iostream>
using namespace std;
long long quick_mod(long long a,long long b,long long m) /*快速幂算法,类似二分的思想*/
{
long long ans = 1;
while(b)
{
if(b&1)
{
ans*=a;
ans%=m;
}
b>>=1LL;
a*=a;
a%=m;
}
return ans;
}
int main()
{
int ncase,mcase;
long long m,a,b;
cin>>ncase;
while(ncase--)
{
long long sum = 0;
cin>>m;
cin>>mcase;
while(mcase--)
{
cin>>a>>b;
sum =(sum+quick_mod(a,b,m))%m;
}
sum=sum%m;
cout<<sum<<endl;
}
return 0;
}