求解因子和与因子个数的本质是——素因子分解
算法实现:
(1)正因子个数
ll count(ll n)
{
ll ans=1;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
ll a=0;
do{
n/=i;
a++;
}while(n%i==0);
ans=ans*(a+1);
}
}
if(n>1) ans=ans*2;
return ans;
}
(2)正因子之和
ll sum(ll n)
{
ll ans=1;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
ll a=1;
do{
n/=i;
a*=i;
}while(n%i==0);
ans=ans*(a*i-1)/(i-1);
}
}
if(n>1) ans*=(n+1);
return ans;
}
poj 2992: Divisors
解题思路:把组合数写成阶乘的形式,以n!为例,小于等于n的prime都是素因子,
利用数论的知识:n!素因子分解中素数p的幂为[n/p]+[n/p^2]+[n/p^3]+[n/p^4]+……
可以求出每个素因子在n!中的幂,+1乘起来就是因子的总个数。
注意:这道题很容易超时,先打表,少用long long
参考代码:
#include
#include
#include
#include
poj 1845: Sumdiv
解题思路:
参考链接:http://blog.csdn.net/lyy289065406/article/details/6648539
参考代码+部分注释:
#include
#include
#include
#include
hdu 1452:Happy 2004
参考poj1845的解题思路,先对2004素因子分解,然后递归二分等比数列求和。
参考代码:
#include
#include
#include
#include
poj 2480: Longge's problem
解题思路:
(数论水平不高,只会这样理解)对于∑gcd(i, n) 1<=i <=n,gcd(i,n)的结果一定是N的因子,首先从gcd(i,N)=1的情况开始考虑,所有的情况个数恰好为欧拉函数值Phi(n);现在我们将其推广到gcd(i,N)=p的情况(p为N的一个因子),那么将n/p后i、n/p互素,gcd(i,N)=p的个数即为欧拉函数值phi(n/p),所以,我们要计算的
∑gcd(i, n)=∑p*phi(n/p),遍历所有因子即可。参考代码如下:
#include
#include
#include
#include