某有银用DP吗???

其实这道题用来学习DP(动态规划)也挺好的

先创个数组a[i]用于存储每个数的约数

1
int a[1000000];

再将i从1枚举到n

1
for(int i=1;i<=n;i++)

而且,可以从i的枚举i的倍数,且i绝对为i的倍数的约数
So。。。可设个变量j获得i的j倍

而且向前填数组的时候要注意i*j<=n即可

最后,1也算约数,所以a[i]++;

代码奉上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
int a[1000000],n,sum;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int j=2;
while(j*i<=n)
{
a[j*i]++;
j++;
}
a[i]++;
}
for(int i=1;i<=n;i++)sum+=a[i];
cout<<sum;
}