Harmonic Number (II) LightOJ - 1245

    科技2022-08-19  91

    求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; }
    Processed: 0.016, SQL: 9