求f(n)=n/1+n/2…n/n,其中n/i保留整数
f(n)这个函数刚好关于y=x对称,对称点位sqrt(n);
所以ans2-nn就可以求出来了
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
ll n,m,ans=0,i;
scanf("%lld",&n);
m=sqrt(n);
for(i=1;i<=m;i++)
{
ans+=n/i;
}
printf("Case %d: %lld\n",cas,ans*2-m*m);
}
return 0;
}
还有一种就是,n/i-n/(i+1)刚好是i个数的值,可以自己试一下
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
ll n,m,ans=0,i;
scanf("%lld",&n);
m=sqrt(n);
for(i=1;i<=m;i++)
{
ans+=n/i;
if(n/i>n/(i+1))
{
ans+=(ll)(n/i-n/(i+1))*i;
}
}
if(n/m==m)
ans-=m;
printf("Case %d: %lld\n",cas,ans);
}
return 0;
}