【BZOJ1968】【AHOI2005】COMMON约数研究

1

题解

知识点:

数学,线性筛,约数个数定理

分析:

由正整数唯一分解定理 $N=\displaystyle\prod_{i=1}^{k}{p_{i}^{r_i}}$可以知道,所有的质因子及其次数都是确定的。

又有约数个数定理:$d(n)=\displaystyle\prod_{i=1}^{k}1+r_i$

所以只要套用模板就可以解决问题了。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=1000010;
int n,m,pr[maxn],num[maxn],d[maxn];
long long ans;
bool v[maxn];

int main()
{
int i,j;
scanf("%d",&n);
v[1]=0;
num[1]=1;
d[1]=1;
for (i=2;i<=n;i++)
{
if (!v[i])
{
pr[++m]=i;
d[i]=2;
num[i]=1;
}
for (j=1;j<=m&&pr[j]*i<=n;j++)
{
v[i*pr[j]]=1;
if (i%pr[j]==0)
{
d[i*pr[j]]=d[i]/(num[i]+1)*(num[i]+2);
num[i*pr[j]]=num[i]+1;
break;
}
else
{
d[i*pr[j]]=d[i]*2;//d[i*pr[j]]=d[i]*d[pr[j]];
num[i*pr[j]]=1;
}
}
}
for (i=1;i<=n;i++)
ans+=d[i]+0ll;
printf("%lld\n",ans);
return 0;
}

先留一个坑,要写线性筛五连(素数,约数个数,约数和,欧拉函数,莫比乌斯函数)的总结。

显示 Gitment 评论