快速冪模板(病毒)

快速冪模板(病毒)

快速冪並不陌生,就不多說了,嗯。
直接上題。

題目描述

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≤230,1≤M≤1152921504606846976;
對於 3/3 數據:1≤N≤230,1≤P≤260,1≤M≤1152921504606846976

其實就是(n+1)^m%p,但n,m,p取值範圍都很大,所以用快速冪。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
using namespace std;

long long n,m,p;

inline long long ksc(long long x,long long y)
{
    long long ans=0;
    while(y>0)
    {
        if(y&1)
            ans=(ans+x)%p;   //同樣爲了節省時間,用了快速乘。
        y=y>>1;
        x=(x+x)%p;
    }
    return ans;
}

inline long long ksm(long long x,long long y)
{
    long long ans=1;       //注意快速冪時,初始化ans爲1。
    while(y>0)
    {
        if(y&1)
            ans=ksc(ans,x);
        y=y>>1;
        x=ksc(x,x);
    }
    return ans;
}

int main()
{
    cin>>n>>m>>p;
    cout<<ksm(n+1,m);
    return 0;
}

。。。。。就這樣。

——我認爲return 0,是一個時代的終結。

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