【問題描述】
輸入b,p,k的值,求bp mod k的值。其中b,p,k*k為長整形數。
【輸入樣例】mod.in
2 10 9
【輸出樣例】mod.out
2^10 mod 9=7
題目的只要特點是數據過大,
下面先介紹一個原理:A*B%K = (A%K )*(B% K )%K。顯然有了這個原理,就可以把較大的冪分解成較小的;
因為是2的10次方數據過大,那有什么辦法可以把數據給拆開呢?2的10次方,為兩個2的5次方的乘積,而2的5次方又可以
分解為兩個2的2次方和一個2的一次方的乘積,利用上述的原理,我們只需要把拆開的數進行模運算就可以,這與大數進行模運算方法相同,
而且拆開的每個數模運算完成之后就可以計算出大數的結果,所以算法是分治。
【代碼】
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int b,p,k; int f(int); int main() { scanf("%d%d%d",&b,&p,&k); b%=k;//防止b過大 cout<<f(p); return 0; } int f(int x) { if(x==0)return 1;//任何數的0次方模k都等於1 int tmp=f(x/2)%k;//a*b%k=a%k*b%k%k; tmp=(tmp*tmp)%k; if(x%2==1)tmp=(tmp*b)%k; return tmp; }
