简单的数论

来源:互联网 发布:通讯录软件哪个好 编辑:程序博客网 时间:2024/05/20 13:16

简单的数论

Crawling in process...Crawling failedTime Limit:3000MS    Memory Limit:32768KB     64bit IO Format:%lld & %llu

Submit Status Practice LightOJ 1245 uDebug

Description

Input

Output

Sample Input

Sample Output

Hint

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 givenn, 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

先看两个例子
1.
n = 10    sqrt(10) = 3     10/sqrt(10) = 3
i        1   2   3         4   5   6   7   8   9   10
n/i    10  5   3         2   2   1   1   1   1    1
 
m =  n/i
sum += m;
m = 1的个数10/1-10/2 = 5;
m = 2的个数10/2-10/3 = 2;
m = 3的个数10/3-10/4 = 1;
 
2.
n = 20     sqrt(20) = 4     20/sqrt(20) = 5
i        1   2   3   4       5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20
n/i    20  10 6   5       4   3   2   2   2    2     1     1     1     1     1     1     1     1    1    1
 
m =  n/i
sum += m;
m = 1的个数20/1-20/2 = 10;
m = 2的个数20/2-20/3 = 4;
m = 3的个数20/3-20/4 = 1;
m = 4的个数20/4-20/5 = 1;
...
m = i的个数20/i - 20/(i + 1)(1<= i <= sqrt(n))
 
这样我们可以得出:sqrt(n)之前的数我们可以直接用for循环来求
sqrt(n)之后的sum += (n/i - n/(i + 1)) * i;
当sqrt(n) = n / sqrt(n)时(如第一个例子10,sum就多加了一个3),sum多加了一个sqrt(n),减去即可;


#include<stdio.h>#include<math.h>long long we(long long  n ){    long long res = 0;    long long int i;    for(  i=1; i<sqrt(n); i++ )    {        res=res+(n/i-n/(i+1))*i;    }        //printf("i=%lld\n",i);    for(int j=1; j<=n/i; j++)    {        res = res + n / j;    }//    if(sqrt(n)==n/sqrt(n))//        {//            res=res-n/sqrt(n);//        }//        else//        res=res;    return res;}int main(){    int t;    scanf("%d",&t);    int g=0;    while(t--)    {        g++;        int n;        scanf("%d",&n);        printf("Case %d: ",g);        printf("%lld\n",we(n));    }}
<div>#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm></div><div></div><div>using namespace std;const int N = 10010;typedef long long ll;</div><div></div><div>int main(){    int t, n, p = 0;    ll sum;    scanf("%d", &t);    while(t--)    {        sum = 0;        p++;        scanf("%d", &n);        int m = sqrt(n);        for(int i = 1 ; i <= m ; i++)            sum += n / i;        for(int i = 1 ; i <= m; i++)             sum += (n / i - n / (i + 1)) * i;        if(m == n / m)            sum -= m;        printf("Case %d: %lld\n", p, sum);    }    return 0;}</div>


0 0