10月4日备战Noip2018模拟赛5(B组)
T3 Num约数研究
题目描述
F(n)的表示Ñ的约数个数,现在给出N,要求求出的F(1)到F(N)的总和。
输入格式
输入一行,一个整数n
输出格式
输出一个整数,表示总和
输入样例
3
输出样例
5
数据范围
20%N <= 5000
100%N <=千万
暴力?打表?
考试时有人将所有数据都打表,程序放在旁边跑了据说一个小时,电解金属锰...
嗯..这道题其实是一道数学问题,把公式推出来就可以了
先上公式
那么这个公式是怎么推出来的呢?
的尴尬自问自答
中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;
}