#include <iostream>
using namespace std;
//计算a^bmodn
int modexp(int a,int b,int n)
{
int ret=1;
int tmp=a;
while(b)
{
//基数存在
if(b&0x1) ret=ret*tmp%n;
tmp=tmp*tmp%n;
b>>=1;
}
return ret;
}
int main()
{
int Z,M,H,a,b,ans;
cin >> Z;
while(Z--)
{
ans=0;
cin >> M >> H;
while(H--)
{
cin >> a >> b;
ans+=modexp(a%M,b,M);//我表示不懂这儿,是看别人写的,我觉得是(a1^b1+.....)%M=(a1^b1)%M+...为什么是((a%M)^b)%M+....?求解释!
//(a+b)%c=(a%c+b%c)%c
}
cout << ans%M << endl;
}
return 0;
}
思路《算法导论》也有!
发帖问啦,明白啦!!
(a+b)%c=(a%c+b%c)%c那么是不是(a1+a2+...)%c=(a1%c+a2%c+...)%c?
求证明过程!!!
不是一般性,设
a1 = m1*c + n1 => a1%c = n1
a2 = m2*c + n2 => a2%c = n2
...
an = mn*c + nn => an%c = nn
其中n1,n2...,nn都属于半开半闭区间[0,c)
那么
(a1+a2+...an)%c
= [(m1+m2+...mn)*c + (n1+n2+...nn)]%c
= (n1+n2+...nn)%c
= (a1%c + a2%c + ... +an%c)%c