给定范围 [1, 2 百万],对于该范围内的每个数字,我需要生成并存储数组中每个整数的除数。
因此,如果 x=p1^(a1)*p2^a2*p3^a3,其中 p1, p2, p3 是素数,则 x 的除数总数由 (p1+1) (p2+1) (p3+ 1)。我生成了所有低于 2000 的素数,对于范围内的每个整数,我进行了试除法以获得每个素数因子的幂,然后使用上面的公式计算除数的数量并存储在数组中。但是,这样做非常慢,大约需要 5 秒才能为给定范围内的所有数字生成除数。
我们可以用其他有效的方式来做这个总和,可能不分解每个数字吗?
下面是我现在使用的代码。
typedef unsigned long long ull;
void countDivisors(){
ull PF_idx=0, PF=0, ans=1, N=0, power;
for(ull i=2; i<MAX; ++i){
if (i<SIEVE_SIZE and isPrime[i]) factors[i]=2;
else{
PF_idx=0;
PF=primes[PF_idx];
ans=1;
N=i;
while(N!=1 and (PF*PF<=N)){
power = 0;
while(N%PF==0){ N/=PF; ++power;}
ans*=(power+1);
PF = primes[++PF_idx];
}
if (N!=1) ans*=2;
factors[i] = ans;
}
}
}