如果不会线性筛素数的话,建议先看这篇博客了解一下线性筛素数。
线性寻找约数的个数(积性函数都可以线性筛)主要是在线性筛素数的基础上得到的
用 f(n) 表示 n 的约数的个数
用 g(n) 表示 n 的最小质因子的个数
我们知道:
若 n=∏i=1npiti
则 f(n)=∑i=1n(ti+1)
所以:
1、当 n 是质数时, g(n)=1,f(n)=2
对于 2和3 设 d=pn 其中 p 为 n 的最小质因子
2、当 p 是 d 的某个质因子时, 则 g(n)=g(d)+1,f(n)=g(d)+1f(d)∗(g(n)+1)
3、当 p 与 d 互质时, g(n)=1,f(n)=f(d)∗(g(n)+1)
good luck and have fun!!!
附上代码:
int num[MAXN],d[MAXN];//num存约数个数,d存一个数最小质因子的个数
void fun(int n)
{
memset(vis,0,sizeof(vis));
num[1]=1;
d[1]=1;
prime[0]=0;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[++prime[0]]=i;
d[i]=1;
num[i]=2;
}
for(int j=1;j<=prime[0]&&i<=n/prime[j];j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
d[i*prime[j]]=d[i]+1;
num[i*prime[j]]=num[i]/(d[i]+1)*(d[i]+2);
break;
}
d[i*prime[j]]=1;
num[i*prime[j]]=num[i]*2;
}
}
}