-
引入:
先来看一个问题,求的所有约数之和
;
解决思路如下:首先将分解质因数,表示为
,其中
均为质数,因此
表示为:
。此时我们将
的所有约数表示为集合
,从这
个约数中选出
个数的乘积即为一个约数。
此时我们根据乘法分配律反推:所有约数之和为:
而如何求解每一对括号内的等比数列和?
-
正文
等比数列求和通项公式:
注意,如果解决此类问题,对于除法应为在的条件下做同余,需要用到逆元,还需要关注
是否为素数
而这里问题来了,我们想用更快的没有除法的方法求等比数列和
考虑分治法:如果为奇数,
若为偶数:有类似地:
具体代码实现:
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;
}
结合快速幂,可在复杂度内求出等比数列和。