=== ===
这里放传送门
=== ===
题解
这道题的意思是求
[1,n]
内每个数约数个数的和。如果设
d(x)
表示
x
的约数个数,那么设
- 对于一个数
i
,当
- 当
i
的最小质因子
- 当
i
的最小质因子指数不为1的时候,因为最小质因子的次数增加了1,所以只要把
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[1000010],e[1000010],n,prm[1000010];
bool ext[1000010];
long long sum;
int main()
{
scanf("%d",&n);
d[1]=e[1]=1;sum=1;
for (int i=2;i<=n;i++){
if (ext[i]==false){
d[i]=2;e[i]=1;//质数的约数个数为2,最小质因子指数为1
prm[++prm[0]]=i;
}
for (int j=1;j<=prm[0];++j){
if (i*prm[j]>n) break;
ext[i*prm[j]]=true;//不要忘了筛去合数
if (i%prm[j]==0){
d[i*prm[j]]=d[i]/(e[i]+1)*(e[i]+2);//在式子里面更新最小质因子的指数
e[i*prm[j]]=e[i]+1;
break;
}
else{
d[i*prm[j]]=d[i]*d[prm[j]];
e[i*prm[j]]=1;
}
}
sum+=d[i];//一边筛一边累加前缀和
}
printf("%lld\n",sum);
return 0;
}
偏偏在最后出现的补充说明
这都不知道啥时候做的题了只是拿出来玩 Markdown 哈哈哈