题意在题目给出的代码中就可以看得很明白了...
最初的思路就是枚举出来所有n/i值不同的所有i,然后排序遍历一遍,就可以得出正确结果,附上部分代码:
long long ans=0;
int k=3;
num[0]=0,num[1]=1,num[2]=n;
for(int i=2; i<=m; i++)//m是sqrt(n)
{
if(n/i>num[k-2])
{
num[k++]=i;
num[k++]=n/i;
}
}
sort(num,num+k);
for(int i=1;i<k;i++)
{
ans+=(num[i]-num[i-1])*(n/num[i]);
}
万万没想到的是竟然超时了...看来时间卡的特别紧。此时某学长大牛提醒我不用排序...然后现在的思路就是把排序下方那部分省去就好....
完整AC代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
for(int cas=1; cas<=t; cas++)
{
int n,m;
cin>>n;
m=sqrt(1.0*n);
long long ans=0;
for(int i=1;i<=m;i++)
{
ans+=n/i;
if((n/i)>(n/(i+1)))
{
ans+=((n/i)-(n/(i+1)))*i;
}
}
if(m==n/m)
ans-=m;
printf("Case %d: %lld\n",cas,ans);
}
return 0;
}