题目:https://www.luogu.org/problemnew/show/P1403
题意:
定义$f(n)$为n的因子个数。给定一个数n,求$f(1)$到$f(n)$之和。
思路:
最直接的想法就是我们求出每一个f的值,然后求和。
但是如果我们转换一个思路,把f的值打散来求,就很简单了。
f求的是一个数因子的个数,但是也可以看成是某一个数是多少个数的倍数。
1到n的f之和就可以看成是,2的倍数的个数+3的倍数的个数+.......+n的倍数的个数。
也就是说我们去考虑每一个因子对这个和的贡献。
而i的倍数的个数就是$frac{n}{i}$
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<map> 4 #include<set> 5 #include<iostream> 6 #include<cstring> 7 #include<algorithm> 8 #include<vector> 9 #include<cmath> 10 #include<queue> 11 12 #define inf 0x7f7f7f7f 13 using namespace std; 14 typedef long long LL; 15 typedef pair<int, int> pr; 16 17 LL n; 18 19 int main() 20 { 21 scanf("%lld", &n); 22 LL ans = 0; 23 for(LL i = 1; i <= n; i++)ans += n / i; 24 printf("%lld ", ans); 25 26 return 0; 27 }