题目描述
科学家们在 Samuel 星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩,小联被允许用 Samuel II 进行数学研究。
小联最近在研究和约数有关的问题,他统计每个正数 NN 的约数的个数,并以 f(N)f(N) 来表示。例如 1212 的约数有 1,2,3,4,6,121,2,3,4,6,12,因此 f(12)=6f(12)=6。下表给出了一些 f(N)f(N) 的取值:
NN | 11 | 22 | 33 | 44 | 55 | 66 |
---|---|---|---|---|---|---|
f(N)f(N) | 11 | 22 | 22 | 33 | 22 | 44 |
现在请你求出:
\sum_{i=1}^n f(i)i=1∑nf(i)
输入格式
输入一个整数 nn。
输出格式
输出答案。
说明/提示
- 对于 20% 的数据,N ≤5000;
- 对于 100% 的数据,1 ≤N≤10的六次方
标签:数学 枚举
难度:普及-
题目传送门:[AHOI2005]约数研究 - 洛谷
题析
这题就是一个考思路的问题
首先关注一下题目,甚么是约数?
约数就是一个能将这个数整除的数,这个时候自然想到了精心挑选暴力枚举
不用测,绝对超时,10的六次方在那里摆着呢
那么,怎么精简呢?
借用洛谷大佬约数表
可以看到,只有2的倍数的约数有2,只有3的倍数的约数有3(废话)
也就是,可以倒过来推,只有n的倍数中含有n这个约数
再转换一下,1~12中1的倍数的数量是12/1=12,2的倍数的数量是12/2=6,3的倍数的数量是12/3=4···
由此,n的倍数的数量是n/n=1。
那么问题就十分的简洁了,就是求n/k(1,2,3···n)的和
AC代码
#include <iostream>
using namespace std;
int main()
{
int x,y=0;
cin>>x;
for(int i=1;i<=x;i++)
{
y+=x/i;
}
cout<<y<<endl;
}
完awa