牛客练习赛25-A-因数个数和(数学)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/82077918

题目链接:https://www.nowcoder.com/acm/contest/158/A

题目描述 

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次,以此类推,然后乘以2(乘以2是因为一个数的因子有i,则n / i也是n的因子)再减去重复计算的,每个数i都有i-1个重复计算了,再减去自己跟自己相乘的情况,合起来就是减去t*t

#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/sugarbliss/article/details/82077918