这种题目以前就曾经做过,但是这次在做又忘了怎么写,在这里做个总结,任意一个数n都可以表示成p1^n1*p2^n2*p3^n3..........(p1,p2....是n的素因子,n1,n2是p1,p2的个数),n因子的个数就num=(n1+1)*(n2+1)*........
所以我们在算因子个数的时候,就要先筛素数,筛素数的方法有很多种,效率也都不一样,用不同的方面也影响着后面算n1,n2....同样也影响后来算num的效率
这里有一种的算法。。。
void make_prime()
{
pn=0;
for(int i = 2; i < N; i++){
if(!pt[i]) pr[pn++]=i, pt[i]=i;
for(int j=0; j < pn && pr[j]*i < N; j++){
pt[pr[j]*i] = pr[j];
if(i % pr[j] == 0) break;
}
}
}
int solve(int n)
{
int ans=1;
while (n!=1)
{
int t=0;
int k=pt[n];
while (!(n%k))
{
n/=k;
t++;
}
ans*=t+1;
}
return ans;
}
最后推荐两道题
foj 1607 Greedy division http://acm.fzu.edu.cn/problem.php?pid=1607
zju 3286 Very Simple Counting http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3625