约数的和
题目描述:
A^B的约数的和. A和B~1e5
题解:
首先求一个数所有约数的和:18的话,有1个2,2个3,那么就是(1+2)*(1+3+3^2).
其次,这么大,如何快速求出1+p+p^2+p^3+p^4….+p^n.
用二分乘上一个共同的倍数就好.
重点:
关键还是在算一个数的所有约数,考虑对答案的贡献,然后看每一个质数,之后可能情况.
代码:
long long pow_m(long long a,long long n)//快速幂
{
long long ret = 1;
long long tmp = a%MOD;
while(n)
{
if(n&1)ret = (ret*tmp)%MOD;
tmp = tmp*tmp%MOD;
n >>= 1;
}
return ret;
}
//计算1+p+p^2+...+p^n
long long sum(long long p,long long n)
{
if(p == 0)return 0;//边界条件
if(n == 0)return 1;
if(n & 1)
{
return ((1+pow_m(p,n/2+1))%MOD*sum(p,n/2)%MOD)%MOD;
}
else return ((1+pow_m(p,n/2+1))%MOD*sum(p,n/2-1)+pow_m(p,n/2)%MOD)%MOD;//将n/2拆出来.
}
//返回A^B的约数之和 % MOD
long long solve(long long A,long long B)
{
getFactors(A);
long long ans = 1;
for(int i = 0;i < fatCnt;i++)
{
ans *= sum(factor[i][0],B*factor[i][1])%MOD;
ans %= MOD;
}
return ans;
}