#include<iostream> #define LL long long using namespace std; //快速幂算法 LL pow(LL a,LL b,int m){ LL r=1,base=a; while(b!=0){ if(b&1) r=r*base%m;//同余模公式 base=base*base%m;//同余模公式 b>>=1; } return r; } int main(){ int n,r,m; cin>>n; while(n--){ cin>>r>>m; LL x,y,sum=0; for(int i=0;i<m;i++){ cin>>x>>y; sum+=pow(x,y,r); } cout<<sum%r<<endl;//同余模公式 } return 0; }
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为O(log2N),与朴素的O(N)相比效率有了极大的提高。
把b转换成二进制数。
该二进制数第i位的权为
![](http://b.hiphotos.baidu.com/baike/s%3D26/sign=6044c668f703738dda4a0b24b21ba471/faf2b2119313b07e13c5e9c00dd7912396dd8cfa.jpg)
例如
![](http://h.hiphotos.baidu.com/baike/s%3D103/sign=885b42e39c16fdfadc6cc2ee878d8cea/d0c8a786c9177f3e48bd45c571cf3bc79e3d5668.jpg)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
![](http://d.hiphotos.baidu.com/baike/s%3D95/sign=257afe75a8773912c0268964f919a226/e850352ac65c1038803a760ab3119313b17e89b6.jpg)
了解到了这个便有了思路,
在计算幂的过程中,为了保证不溢出,使用同余模公式:
(a+b)%m=(a%m+b%m)%m;
(axb)%m=(a%mxb%m)%m;