10月4日备战Noip2018模拟赛5(B组)T3 Num 约数研究

版权声明:本文为博主原创文章,转载请标明出处 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.. 这道题其实是一道数学问题,把公式推出来就可以了

先上公式

\sum_{i= 1}^{n}f(i) = \sum _{i=1}^{n}n/i

那么这个公式是怎么推出来的呢?

尴尬的自问自答

\sum_{i=1}^{n}f(i)中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;
}

猜你喜欢

转载自blog.csdn.net/MOMING_V/article/details/82941458
num
今日推荐