这道题就是考思维吧。刚开始第一次写,超时了,然后仔细看了H(n)那个函数,发现n/i这个会自动向下取整,意识到会有很多重复的数字,比方说,如果n=10,当i>5时,这个时候,n/i的值都是1,所以就必须优化这个函数!我为了便于思考,自己把n想成100,则i为51~100的值时,n/i都是1,所以我得到一个算法res+=(tmp-n/i)*(i-1),然后注意判断一下条件就解决这个问题了。
#include <iostream>
using namespace std;
long long h(long long n)
{
long long res=0;
long long tmp=n;
for(long long i=1;i<=n&&i<=tmp;++i)
{
res+=n/i;
//cout<<"n/i="<<n/i<<endl;
if((n/(n/i+1)==i-1)&&(n/i>=i))
{
res+=(tmp-n/i)*(i-1);
tmp=n/i;
// cout<<"res="<<res<<endl;
}
//cout<<n/i<<" ";
}
// cout<<endl;
return res;
}
int main()
{
long long n;
cin>>n;
while(n--)
{
long long n1;
cin>>n1;
// cout<<"res"<<endl;
cout<<h(n1)<<endl;
}
return 0;
}