模板:快速幂
是的我要痛心疾首的写一遍快速幂的模板……原本以为这玩意很简单的,然而事实证明……
板子都背错了还说啥?(实际上板子从一开始写的就不对……)
好的那我们开始吧。
————————————
勇者最近发现怪物们的行为异常了起来。
这其中异常的大概是积木怪,原本互相分散的他们竟然开始朝着一个方向去集合。
“莫非……”勇者想到了可怕的想法,那是三十年一次的。
“积木怪攻城!”
(瞎编题时间)
已知积木怪的数量为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;
}
“怎样,是不是很简单啊!”