版权声明:本文为博主原创文章,转载请标明出处 https://blog.csdn.net/MOMING_V/article/details/82941458
10月4日备战Noip2018模拟赛5(B组)
T3 Num 约数研究
题目描述
F(n)表示n的约数个数,现在给出n,要求求出f(1)到f(n)的总和。
输入格式
输入一行,一个整数n
输出格式
输出一个整数,表示总和
输入样例
3
输出样例
5
数据范围
20%N<=5000
100%N<=10000000
暴力?打表?
考试时有人将所有数据都打表,程序放在旁边跑了据说一个小时,emm...
emm.. 这道题其实是一道数学问题,把公式推出来就可以了
先上公式
那么这个公式是怎么推出来的呢?
尴尬的自问自答
中1的个数为所有是1倍数的数,也就是n / i, 那么同理可得2的个数是所有2的倍数的数,也就是n / 2, 所以, 以此类推, 就得到了上面的公式了, 其实打个表找找规律也是费劲简单的, 打表暴力的代码就不贴了, 支持打表正解( • ̀ω•́ ),
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n, i, tot;
int main ()
{
//freopen ("num.in", "r", stdin);
//freopen ("num.out", "w", stdout);
cin >> n;
for (i = 1; i <= n; i ++){
tot = tot + n / i; //公式的实现
}
cout << tot;
//fclose (stdin);
//fclose (stdout);
return 0;
}