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

本文介绍了一种快速幂算法实现,用于高效计算大数的幂次方,并结合此算法给出了多项式求和的递归解法。适用于解决数学问题中涉及的幂运算和多项式求和场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若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

注意,b!=0。

 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 / 2 + 1, p)) * sum(a, b / 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 }

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/10415955.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值