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

          

posted @ 2018-04-24 09:20  Somnus、M  阅读(135)  评论(0编辑  收藏  举报