等比数列求和

本文介绍了如何通过分治法和快速幂技巧,在线性时间内求解等比数列的和,避免了除法运算,适用于解决数学问题中的约数之和计算。
  • 引入:

 先来看一个问题,求a^{b}的所有约数之和mod9901

解决思路如下:首先将a分解质因数,表示为p_1^{c_1}\cdot p_2^{c_2}\cdot...\cdot p_{n}^{c_n},其中p_{i}\left ( 1\leqslant i\leqslant n \right )均为质数,因此a^{b}表示为:p_1^{b\cdot c_1}\cdot p_2^{b\cdot c_2}\cdot...\cdot p_{n}^{b\cdot c_n}。此时我们将a^{b}的所有约数表示为集合\left \{ p_1^{k_1}\cdot p_2^{k_2} ...\cdot p_{n}^{k_{n}}\right \},从这n个约数中选出i个数的乘积即为一个约数。

此时我们根据乘法分配律反推:所有约数之和为:\left ( 1+p_1+p_1^{2}+...+p_1^{b \cdot c_1} \right ) \cdot \left (1+p_2+p_2^{2}+...+p_2^{b \cdot c_2} \right ) \cdot ... \cdot \left ( 1+p_n+p_n^{2}+...+p_n^{b \cdot c_n} \right )

而如何求解每一对括号内的等比数列和?

  • 正文

 等比数列求和通项公式:

 注意,如果解决此类问题,对于除法应为在mod\left ( p \right )的条件下做同余,需要用到逆元,还需要关注p是否为素数

而这里问题来了,我们想用更快的没有除法的方法求等比数列和sum(p,c)=\left ( 1+p+p^{2}+...+p^{c} \right )

考虑分治法:如果c为奇数,sum(p,c)=\left ( 1+p+p^{2}+...+p^{\frac{c-1}{2}} \right )+\left ( p^{\frac{c+1}{2}}+...+p^{c} \right )=\left ( 1+p+p^{2}+...+p^{\frac{c-1}{2}} \right )+p^{\frac{c+1}{2}} \cdot \left ( 1+p+p^{2}+...+p^{\frac{c-1}{2}} \right )=(1+p^{ \frac {c+1} {2} }) \cdot sum(p, \frac{c-1}{2} )

c为偶数:有类似地:sum(p,c)=(1+p^{ \frac {c} {2} }) \cdot sum(p, \frac{c}{2} -1)+p^{c}

具体代码实现:

ll sum(ll a,ll b,ll mod)
{
    if(b==0) return 1;
    if(b&1) return (sum(a,b/2,mod)*(quick_pow(a,b/2+1,mod)+1))%mod;
    else return ((sum(a,b/2-1,mod)*(quick_pow(a,b/2,mod)+1))+quick_pow(a,b,mod))%mod;
}

结合快速幂,可在Olog(c)复杂度内求出等比数列和。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值