poj 1845

来源:互联网 发布:linux安全狗 编辑:程序博客网 时间:2024/06/11 04:00

约数的和

题目描述:

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^nlong 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的约数之和 % MODlong 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
原创粉丝点击