题目描述:求
∑
i
=
1
n
f
(
i
)
\sum_{i=1}^n f(i)
∑i=1nf(i) ,
f
(
i
)
f(i)
f(i) 表示
i
i
i的因子个数。即,求
1
到
n
1到n
1到n所有因子的个数和。
由于
n
n
n最大到
1
0
6
10^6
106因此,暴力就不用考虑了。
- 不难发现:
- 1作为因子出现了n次。(1,2,3,4,…n)
- 2作为因子出现了n/2次。(2,4,6,8,10…,n)
- 3作为因子出现了n/3次。(3,6,9,12,14…,n)
- 一直下去
- 因此我们只需考虑每个数作因数出现的次数即可,即每个数对答案的贡献,做累加就OK
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#define maxn 200005
#define INF 0x3f3f3f3f
#define mst(a) memset(a,0,sizeof a)
#define mststr(a) memset(a,'\0',sizeof a)
#define ll long long
using namespace std;
//题号:约数个数和
int ans(int n){
int sum=0;
for(int i = 1;i <= n;i++)
{//因子出现次数的累加
sum += n / i;
}
return sum;
}
int main(){
int n;
scanf("%d",&n);
cout<<ans(n)<<endl;
return 0;
}