码迷,mamicode.com
首页 > 其他好文 > 详细

分治法求sum(a,b)=1+a+a^2+...+a^b=?

时间:2019-02-22 00:46:15      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:long   return   def   amp   bsp   偶数   div   lse   while   

若b为奇数,则

sum(a,b)=1+a+a^2+...+a^b=(1+a+a^2+...+a^((b-1)/2))+(a^((b+1)/2)+...+a^b)=(1+a^((b+1)/2))*sum(a,(b-1)/2)

若b为偶数,则

sum(a,b)=(1+a^(b/2))*sum(a,b/2-1)+a^b

 1 typedef long long ll;
 2 
 3 ll qpow(ll a, ll b, ll p) {
 4     ll ans = 1, x = a % p;
 5     while (b) {
 6         if (b & 1) ans = ans * x % p;
 7         x = x * x % p, b >>= 1;
 8     }
 9     return ans;
10 }
11 
12 ll sum(ll a, ll b, ll p) {
13     if (!b) return 1;
14     if (b & 1)
15         return (1 + qpow(a, (b + 1) / 2, p)) * sum(a, (b - 1) / 2, p) % p;
16     else
17         return ((1 + qpow(a, b / 2, p)) * sum(a, b / 2 - 1, p) % p + qpow(a, b, p)) % p;
18 }

 

分治法求sum(a,b)=1+a+a^2+...+a^b=?

标签:long   return   def   amp   bsp   偶数   div   lse   while   

原文地址:https://www.cnblogs.com/Mr94Kevin/p/10415955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!