本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1403
其实是一道水题啦。。。
我一开始的做法近似埃拉托斯特尼筛法,枚举每个约数,然后将其倍数的约数个数加1,最后统计。而一种更为简便的方法是枚举1到n所有数,给答案加上n/i。虽然这是道水题,但因为正解值得学习我才整理的!!!
为什么这样是对的呢?显然,1到n所有数的约数个数之和等于约数中含有1,2,...,n的数的个数之和。
1 #include <cstdio> 2 3 const int maxn = 1e6 + 5; 4 5 int n, m, f[maxn]; 6 7 int main() { 8 scanf("%d", &n); 9 for (int i = 2; i <= n; ++i) 10 for (int j = i; j <= n; j += i) ++f[j]; 11 for (int i = 2; i <= n; ++i) m += f[i]; 12 printf("%d", m + n); 13 return 0; 14 }
1 #include <cstdio> 2 3 int main() { 4 int n, m; 5 scanf("%d", &n); 6 for (int i = 1; i <= n; ++i) 7 m += n / i; //1到n所有数约数个数等于约数中包含1,2,...,n的数的个数之和 8 printf("%d", m); 9 return 0; 10 }