快速冪模板(病毒)
快速冪並不陌生,就不多說了,嗯。
直接上題。
題目描述
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,是一個時代的終結。