线性筛因数个数

Posted PPL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性筛因数个数相关的知识,希望对你有一定的参考价值。

讲解

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

如果一个数 \\(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;
		}
	}
}

以上是关于线性筛因数个数的主要内容,如果未能解决你的问题,请参考以下文章

线性筛

线性筛

质因数分解+欧拉筛+线性基

算法竞赛模板(数论)

素数筛法

线性(欧拉)筛&欧拉函数