【解题报告】LightOJ1245-Harmonic Number (II)

    技术2022-07-10  103

    可以打表找规律,也可以画图理解,但我还是不会(菜 简单来说就是,要把n的复杂度降到sqrt(n) 然后前1~sqrt(n)可以暴力,后边的对于数i 有n/i-n/(i+1)个 所以最后结果就变成了 n/i+i*(n/i-n/(i+1)) i从1~sqrt(n) 但对于i=sqrt(n)时,如果n/i==i的话这个会算两次 所以最后 AC代码:

    #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { int t;cin>>t; for(int j=1;j<=t;j++){ LL n;cin>>n; LL ans=0; LL m=sqrt(n); for(LL i=1;i<=m;i++){ ans+=n/i+i*(n/i-n/(i+1)); } if(m==n/m) ans-=m; cout<<"Case "<<j<<": "<<ans<<endl; } }
    Processed: 0.031, SQL: 9