講解鏈接: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