H(n)
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
2
5
10
样例输出 #1
10
27
分析
题目让我们优化
#include<iostream>
using namespace std;
long long H(int n){
long long res=0;
for(int i=1; i<=n; ++i)
res+=n/i;
return res;
int main()
{
long long n,t;
cin>>t;
while(t--){
cin>>n;
cout<<H(n)<<endl;
}
}
也就是让我们用更快的方法求
[n/i](表示n/i向下取整)
因为是向下取整,有些值是一样的,所以我们不难发现,这些值是像一个个的区域。
所以每个相同的区域的i的最大值为:[n/[n/i]]
代码
#include <bits/stdc++.h>
using namespace std;
long long n;
long long h(long long n)
{
long long res=0,k=0;
for(long long i=1;i<=n;i=k+1)
{
k=n/(n/i);//属于哪个区间
res=res+(k-i+1)*(n/i);//求[n/i]
}
return res;//返回值
}
long long T;
int main()
{
cin>>T;
while(T--)
{
cin>>n;
cout<<h(n)<<endl;
}
return 0;
}