求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;
}