洛谷P1403 约数研究【思维】

题目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 }
原文地址:https://www.cnblogs.com/wyboooo/p/10375010.html