讲解
我们只需要知道这样一件事:
如果一个数 (n=prod p_i^{c_i})。
那么因数个数 (d_n=prod(c_i+1))。
代码
int prime[MAXN],pn,f[MAXN],g[MAXN];
bool vis[MAXN];
void sieve(int x)
{
for(int i = 2;i <= x;++ i)
{
if(!vis[i]) prime[++pn] = i,f[i] = 2,g[i] = 1;
for(int j = 1;j <= pn && i * prime[j] <= x;++ j)
{
vis[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
g[i * prime[j]] = g[i] + 1;
f[i * prime[j]] = f[i] / (g[i]+1) * (g[i]+2);
break;
}
g[i * prime[j]] = 1;
f[i * prime[j]] = f[i] * 2;
}
}
}