poj 1845

约数的和

题目描述:

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值