【AHOI2005】约数研究

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值