模板:快速冪

是的我要痛心疾首的寫一遍快速冪的模板……原本以爲這玩意很簡單的,然而事實證明……
板子都背錯了還說啥?(實際上板子從一開始寫的就不對……)
好的那我們開始吧。
————————————
勇者最近發現怪物們的行爲異常了起來。
這其中異常的大概是積木怪,原本互相分散的他們竟然開始朝着一個方向去集合。
“莫非……”勇者想到了可怕的想法,那是三十年一次的。
“積木怪攻城!”

(瞎編題時間)
已知積木怪的數量爲n,他們的個體攻擊力爲2,但是n個積木怪疊加起來的話,他們的總攻擊力就會變成可怕的2的n次冪。
不過好在積木怪這種沒腦子的傢伙羅高了就會倒塌,經過古代賢者對於這種生物的考究,這種生物的攻擊力始終不會超過1e9+7,因此你只需要把結果對1e9+7取模即可。
————————————
“其實積木怪挺善良的……要是換做別的組合怪的話,可能就要用到高精度了……”路由器一邊嘟囔着,看着勇者用c++魔法語言自帶的pow函數去清理小怪——毫不費事。
“等等,什麼時候出來了這麼大的怪……快算啊pow……”
【提示:您的體力值爲0,已經自動回城】
“什麼鬼?計算出來的結果這麼大……”
回城後,pow憋了五六秒的時間纔給出了結果,這令勇者十分的沮喪。
“沒事,我們還有一招!”
路由器將勇者帶到了照相館那裏,很輕易翻到了一本魔法書。
“快速冪”
“快速冪採用二分的思想,對於任意的k的n次冪,如果n爲偶數,那麼就等於k^(n/2)*k^(n/2),如果爲奇數則再多乘以k即可。”
“利用遞歸的思想,我們很容易寫出如下的代碼。”

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
const long long q=1e9+7;
long long qpow(long long k,long long n){
    if(n==0)return 1;
    if(n==1)return k;
    long long p=qpow(k,n/2)%q;
    if(n%2==0)return p%q*p%q;
    else return p%q*p%q*k%q;
}
int main(){
    int n;
    scanf("%d",&n);
    printf("%lld",qpow(2,n)%q);
    return 0;
}

“怎樣,是不是很簡單啊!”

發佈了59 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章