1. 程式人生 > >poj1995---Raising Modulo Numbers

poj1995---Raising Modulo Numbers

tdi pow line pac return 證明 turn 多次 namespace

tips:

  1.(a*b)%c=[(a%c)*(b%c)]%c,其他的公式都是由此引出的

  2.代碼裏主要是這樣處理了(a*b)%c=(a%c)*b%c

  3.快速冪也叫二分冪,有遞歸寫法,判斷b的奇偶,詳見算法筆記

技術分享圖片
//long long 如果輸入不使用%lld的話,如果輸入數據超過int範圍會wa
//(a+b)%c=(a%c+b%c)%c;
//(a*b)%c=[(a%c)*(b%c)]%c
//(a^b)%c=(a%c)^b%c---冪是多次乘法
//(a*b)%c=(a%c)*b%c
//有詳細證明:https://blog.csdn.net/qq_36285879/article/details/53284431
#include<cstdio> using namespace std; int z; int m,h; long long ans,a,b; long long binaryPow(long long a,long long b, int m ){ long long ans=1; while(b>0){ if(b&1){ ans=ans*a%m;//(a*b)%c=(a%c)*b%c } a=a*a%m;//(a%c) b=b>>1; }
return ans; } int main(){ scanf("%d",&z); while(z--){ scanf("%d%d",&m,&h); long long ans=0; for(int i=0;i<h;i++){ scanf("%lld%lld",&a,&b); ans+=binaryPow(a,b,m); } ans=ans%m; printf("%lld\n",ans); }
return 0; }
View Code

poj1995---Raising Modulo Numbers