zoukankan      html  css  js  c++  java
  • light_oj 1245 求[n/i]的前n项和

    light_oj 1245 求[n/i]的前n项和

    G - Harmonic Number (II)
    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

    Description

    I was trying to solve problem '1234 - Harmonic Number', I wrote the following code

    long long H( int n ) {
        long long res = 0;
        for( int i = 1; i <= n; i++ )
            res = res + n / i;
        return res;
    }

    Yes, my error was that I was using the integer divisions only. However, you are given n, you have to find H(n) as in my code.

    Input

    Input starts with an integer T (≤ 1000), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n < 231).

    Output

    For each case, print the case number and H(n) calculated by the code.

    Sample Input

    11

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    2147483647

    Sample Output

    Case 1: 1

    Case 2: 3

    Case 3: 5

    Case 4: 8

    Case 5: 10

    Case 6: 14

    Case 7: 16

    Case 8: 20

    Case 9: 23

    Case 10: 27

    Case 11: 46475828386

    题意:求[n/i]的前n项和

    思路:在i=1到sqrt(n)时,[n/i]是不重复的,直接计算;在i>sqrt(n)时,反着数,从n/n,n/(n-1),...,n/(n/2+1),每个值为1,总共(n-n/2)个,以此类推,值为i的个数为i*(n/i-n/(i-1)),i应该是小于等于sqrt(n)的,而当[sqrt(n)]==n/[sqrt(n)]时,[sqrt(n)]被计算了两次,特判即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<set>
    #include<map>
    #include<string>
    #include<math.h>
    #include<cctype>
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=(1<<29);
    const double EPS=0.0000000001;
    const double Pi=acos(-1.0);
    
    ll n;
    
    ll f(ll n)
    {
        ll res=0;
        for(ll i=1;i<=sqrt(n);i++) res+=n/i;
        for(ll i=1;i<=sqrt(n);i++) res+=i*(n/i-n/(i+1));
        if((ll)sqrt(n)==n/(ll)sqrt(n)) res-=(ll)sqrt(n);
        return res;
    }
    
    int main()
    {
        int T;cin>>T;
        int tag=1;
        while(T--){
            cin>>n;
            printf("Case %d: %lld
    ",tag++,f(n));
        }
        return 0;
    }
    View Code
     
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    PowerDesigner16 破解
    双向链表的实现与操作(C语言实现)
    【HDOJ 2063】过山车
    gcc 源代码分析-前端篇2
    Android4.0.4-在build.prop中添加属性的方法【转】
    安卓系统手动添加虚拟按键教程【转】
    android 添加新的键值,自定义按键-2【转】
    android 添加新的键值,自定义按键【转】
    Android下添加新的自定义键值和按键处理流程【转】
    android监听虚拟按键的显示与隐藏【转】
  • 原文地址:https://www.cnblogs.com/--560/p/4550678.html
Copyright © 2011-2022 走看看