G - Harmonic Number (II) (找规律)
大体思路:题意:给定一个n,让你求Σn/i,i从1->n.
PS:这规律按照常规思维真的好难找
规律如下:
对于一个值 n / i 的个数有 n / i - n / ( i +1)个
但是这样暴力的话是O(n),2^32 暴力的话应该也会超,所以还得找找别的地方。于是发现当这个数(n / i)大于 sqrt(n) 时,可以暴力求 n / i,对于小于的用规律求个数再乘以这个数。
#include <iostream> #include <cstdio> #include <cmath> using namespace std; int t; long long n,ans; int main() { ios::sync_with_stdio(false); cin>>t; for(int j=1;j<=t;j++) { ans=0; long long i; cin>>n; for(i=1;i<=sqrt(n);i++) { ans+=n/i; if(n/i>n/(i+1)) ans+=(n/i-n/(i+1))*i; } if (n / (i - 1) == i - 1)//判断重合的时候要减去重复的 ans -= n / (i - 1); printf ("Case %lld: %lld\n", j, ans); } return 0; }