【AHOI2005】约数研究
题目描述
科学家们在 Samuel 星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩,小联被允许用 Samuel II 进行数学研究。
小联最近在研究和约数有关的问题,他统计每个正数 N 的约数的个数,并以 f(N) 来表示。例如 12 的约数有 1,2,3,4,6,12,因此f(12)=6。下表给出了一些 f(N) 的取值:
N 1 2 3 4 5 6
f(N) 1 2 2 3 2 4
现在请你求出:
1∑n f(i)
输入格式
输入一个整数 n。
输出格式
输出答案。
输入输出样例
输入 #1 复制
3
输出 #1 复制
5
说明/提示
对于 20% 的数据,0N≤5000;
对于 100% 的数据,1≤N≤10 ^6 。
分析
这个题 需要把前面一些 f(n)拆开 ,就能发现特别之处。。
比如 :n是2 ,或是2的倍数 那么对应的 f() 的约数里面就有 2,【(例如 f(4)约数有(1,4,2))
f(6)约数有(1,6,2,3)。 f(8)约数有(1,8,2,4)。。。。等等。。。。。】
n是3 ,或是3的倍数 那么 对应的f() 的约数里面就有 3,
n是什么数,n和n的倍数 对应的 f()里面就有n。 那么可以得到公式 :f(i)=n/i
比如:n=8,那 f(1) 到f(8) 就有 4个2 (f2,4,6,8),2个3(f3,6)。。
那么每次我们累计就好了。
代码
//#include<iostream>
//using namespace std;
//int n;
//int f[1000005];
//int ans =1;
//int result(int x){
// int cnt = 0;
// for(int i=1;i*2<= x;i++){
// int a = x/i;
// if(a < i) break;
// if( a * i == x){
// if(a == i) cnt++;
// else cnt += 2;
// }
// }
// return cnt;
//}
//int main(){
// cin>>n;
// f[1] = 1;
//
//
// for(int i=2;i<=n;i++){
// f[i] = result(i);
// ans += f[i];
// }
// cout<<ans;
//
// return 0;
//}
#include<iostream>
using namespace std;
int n;
int ans ;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
ans += n/i;
}
cout<<ans<<endl;
return 0;
}