快速幂算法
int ans = 1;
a = a % c;
while(b>0)
{
if(b % 2 == 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
将上述的代码结构化,也就是写成函数:
int PowerMod(int a, int b, int c)
{
int ans = 1;
a = a % c;
while(b>0)
{
if(b % 2 = = 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
return ans;
}
本算法的时间复杂度为O(logb),能在几乎所有的程序设计(竞赛)过程中通过,是目前最常用的算法之一。
#include <stdio.h>//积的取余等于取余的积的取余->快速幂
#include<string.h>
int M;
int mi(int a,int b)
{
int ans=1;
a=a%M;
while(b>0)
{
if(b%2==1)
ans=ans*a%M;
b=b/2;
a=a*a%M;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
int n;
int a,b;
int sum;
while(T--)
{
scanf("%d",&M);
scanf("%d",&n);
sum=0;
while(n--)
{
scanf("%d%d",&a,&b);
a=a%M;
sum+=mi(a,b);
}
printf("%d\n",sum%M);
}
return 0;
}