A^B mod C(快速冪模板)

講解鏈接:http://blog.csdn.net/zhq0808/article/details/62245545
很詳細的文章。


<板子>

題目描述:
數論課上,老師給 DreamFox 安排了一項任務,用編程實現 A 的 B 次方模 C 。這個當然難不了 ACMer 。於是 DreamFox 回去後就開始用代碼實現了。

輸入格式:
三個整數:a,b,c(0≤a,c<231,0≤b<263)。

輸出格式:
一個整數,即 ab mod c 的結果。

樣例數據 1:
輸入
5 100000000000000 12830603

輸出:
5418958


代碼:

#include<bits/stdc++.h>
using namespace std;

long long a,b,c;

inline void ksm()
{
    long long ans=1;

    a=a%c;

    while(b>0)
    {
        if(b&1) ans=(ans*a)%c;

        b=b>>1;

        a=(a*a)%c;
    }

    cout<<ans<<endl;
}

int main()
{
    cin>>a>>b>>c;

    ksm();

    return 0;
}

<加強版>

題目描述:
2015年1月1日,國際衛生組織公佈了一種新型病毒CAI,其複製能力極強,會使人的記憶能力嚴重衰退。

在每 1 秒內,一個病毒會分身出 N 個病毒(本體不計),它們和本體擁有着同樣的能力,如果 N=4,在第一秒初有 1 個病毒本體,第一秒末分裂出 4 個,那麼第一秒末有 5 個,它們在第二秒末會再分裂 5*4 =20個,那麼加上最開始的,第二秒末就有 25 個。

爲了抑制這種可怕的病毒,清華大學的醫學研究人員經過認真研究這種病毒的基因,發明了一種新型青黴素注射液,能有效的消滅這種病毒。人體只需要注射一次這種青黴素,就可以終身免疫。這種青黴素殺毒的前提是:當病毒的數量必須達到或者超過 P 個(對人體開始有害),藥力纔會自動發揮作用——瞬間全部消滅 P 個病毒。那麼,在第 M 秒末,環境中還有多少病毒呢?(注,第一秒初開始就注射了青黴素)

輸入格式:
輸入數據只有一行,爲 3 個整數 N、M 和 P,其含義如題目描述(初始時,只有一隻病毒)。

輸出格式:
輸出數據只有一行,爲第 M 秒最後剩餘的病毒數目。

樣例數據 1
輸入
4 3 3

輸出
2

樣例數據 2
輸入
10000 1000 1

輸出
0

備註:
【樣例1說明】
第一秒的病毒分裂出 4 個,加上本體就是 5 個,消滅三個還剩兩個。
第二秒的病毒分裂出 2*4=8 個,加上兩個本體就是 10 個,藥力發揮 3 次,消滅了 9 個,還剩一個。
第三秒剩下的那個分裂出 4 個,加上本體就是 5 個,藥力發揮一次消滅三個,還剩兩個。

【樣列2說明】
只要有 1 個病毒,藥力就發揮殺毒功能,顯然沒有病毒能活下來。

【數據範圍】
對於 1/3 的數據:M≤100000;
對於 2/3 數據:1≤N,P≤2^30,1≤M≤1152921504606846976;
對於 3/3 數據:1≤N≤2^30,1≤P≤2^60,1≤M≤1152921504606846976


代碼:

#include<bits/stdc++.h>
using namespace std;

inline long long ksc(long long a,long long b,long long c)
{
    long long tot=0;

    while(b)
    {
        if(b&1) tot=(tot+a)%c;

        b=b>>1;

        a=a*2%c;
    }

    return tot;
}

inline long long work(long long a,long long b,long long c)
{
    long long ans=1;

    while(b)
    {
        if(b&1) ans=ksc(ans,a,c);

        b=b>>1;

        a=ksc(a,a,c);
    }

    return ans;
}

int main()
{
    long long a,b,c;

    cin>>a>>b>>c;

    cout<<work(a+1,b,c)<<endl;

    return 0;
}

<推薦練習題目鏈接>

HDU5187—>zhx’s contest
http://acm.split.hdu.edu.cn/showproblem.php?pid=5187

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章