当前位置: 代码迷 >> 综合 >> Harmonic Number (II) LightOJ - 1245
  详细解决方案

Harmonic Number (II) LightOJ - 1245

热度:53   发布时间:2023-12-22 02:19:22.0

求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;
}
  相关解决方案