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