lightoj 1245 - Harmonic Number (II) 【数学 计数】

来源:互联网 发布:婚纱摄影网络销售技巧 编辑:程序博客网 时间:2024/04/30 15:23
1245 - Harmonic Number (II)
PDF (English)StatisticsForum
Time Limit: 3 second(s)Memory Limit: 32 MB

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

Output for Sample Input

11

1

2

3

4

5

6

7

8

9

10

2147483647

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

 


PROBLEM SETTER: JANE ALAM JAN



题意:给你一个n,让你按照给出的程序求解结果。


太弱了,比赛时没找到规律。。。


令m = sqrt(n)。
ans = sigma( (n / i - n / (i+1)) * i) + n / i)。【1 <= i <= m】
ans -= n / m == m ? n / m : 0。


AC代码:


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <vector>#define INF 0x3f3f3f3f#define eps 1e-8#define MAXN (100000+10)#define MAXM (50000000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;int main(){    int t; Ri(t);    int kcase = 1;    W(t)    {        LL n; Rl(n);        LL ans = 0;        LL m = sqrt(n);        for(LL i = 1; i <= m; i++)            ans += (n / i - n / (i+1)) * i + n / i;        if(m == n / m)            ans -= n / m;        printf("Case %d: %lld\n", kcase++, ans);    }    return 0;}




0 0