线性筛因数个数

讲解

我们只需要知道这样一件事:

如果一个数 (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;
		}
	}
}
原文地址:https://www.cnblogs.com/PPLPPL/p/14815167.html