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

10月4日备战Noip2018模拟赛5(B组)

T3 Num约数研究

题目描述

F(n)的表示Ñ的约数个数,现在给出N,要求求出的F(1)到F(N)的总和。

输入格式

输入一行,一个整数n

输出格式

输出一个整数,表示总和

输入样例

3

输出样例

5

数据范围

20%N <= 5000

100%N <=千万

暴力?打表?

考试时有人将所有数据都打表,程序放在旁边跑了据说一个小时,电解金属锰...

嗯..这道题其实是一道数学问题,把公式推出来就可以了

先上公式

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

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

的尴尬自问自答

\ sum_ {I = 1} ^ {N} F(1)中1的个数为所有是1倍数的数,也就是n / i,那么同理可得2的个数是所有2的倍数的数,也就是n / 2,所以,以此类推,就得到了上面的公式了,其实打个表找找规律也是费劲简单的,打表暴力的代码就不贴了,支持打表正解(•ω•),

代码

#include 
#include 

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;
}

 

 

 

你可能感兴趣的:(NOIP普及,模拟赛,数论,2018秋季集训)