Harmonic Number (II) LightOJ

题意:

求前n项的n/i  的和 只取整数部分

暴力肯定超时。。。然后 。。。现在的人真聪明。。。我真蠢

觉得还是别人的题意比较清晰

比如n=100的话,i=4时n/i等于25,i=5时n/i等于20,于是在大于20到小于等于25内的5个数字j都有n/j等于4,然后ans+=4*5

所以我们可以在小于等于根号n的范围内枚举i,ans+=n/i,然后ans+=(n/(i)-n/(i+1))*i,这样分段加起来

但是又重复的部分。。

即 令m = sqrt(n), 如果n / m == m 则n / (m+1) == m-1  所以在循环进行到最后一项 即m时 n/i - n/(i+1)等于 1 所以在执行 res += (n/i - n/(i+1))*i时(即 res += 1*m 时)多加了一个m

所以要最后判断一下 减去

例如 1、2、3、4、5、6、7、8、9、10 

sqrt(10)= 3

所以 最后应该是1个10   1个5   1个3   2个2   5个1

但在循环执行到i=3 时  多加了一个3

若还不懂  具体看看代码  自己写一下

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define maxn 100009
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int LL_INF = 0x7fffffffffffffff,INF = 0x3f3f3f3f;

int main()
{
    int T;
    cin>> T;
    int cnt = 0;
    while(T--)
    {
        LL n, res = 0;
        cin>> n;
        LL m = sqrt(n);
        for(LL i=1; i<=m; i++)
        {
            res += n/(double)i;
            res += (n/i - n/(i+1)) * i;
        }
        if(n/m == m)
            res -= m;
        printf("Case %d: %lld
",++cnt,res);

    }


    return 0;
}
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/9184774.html