取余運算(mod)(分治)


【問題描述】
       輸入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;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM