A-因数个数和

题目链接                                                      

                                                                                  A-因数个数和

链接:https://www.nowcoder.com/acm/contest/158/A
来源:牛客网
 

因数个数和

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

q次询问,每次给一个x,问1到x的因数个数的和。

输入描述:

第一行一个正整数q ;
接下来q行,每行一个正整数 x

输出描述:

共q行,每行一个正整数表示答案

示例1

输入

复制

4
1
2
3
10

输出

复制

1
3
5
27

说明

1的因数有1

2的因数有1,2

3的因数有1,3

以此类推

备注:

1<=q<=10 ,1<= x<=109

思路:参考自

1~n 约数的个数的和实际就是看 1~n 在这些数中出现过多少次,例如 1是1~n每个数的因数,所以对1这个因数来说,出现了n/1次,以此类推;

发现答案 1/n+2/n+3/n+……+n/n 其实就是函数 y=1/x 在1~n 上的离散和,因为函数关于直线 y=x 对称,求 1~√n 离散合再减去重复的地方即可;(4X4=16)

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,q;
typedef long long int ll;
int main()
{
	ios::sync_with_stdio(false);
	cin>>q;
	while(q--){
		cin>>n;
		ll ans=0,t=sqrt(n);
		for(int i=1;i<=t;i++){
			ans+=n/i;
		}
		cout<<ans*2-t*t<<endl;
	}
}

                                                                                     

猜你喜欢

转载自blog.csdn.net/DaDaguai001/article/details/82048177