`

hdu 2824 The Euler function(筛法欧拉函数)

阅读更多

The Euler function

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1111    Accepted Submission(s): 466

Problem Description
The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose you are given a, b, try to calculate (a)+ (a+1)+....+ (b)

 

Input
There are several test cases. Each line has two integers a, b (2<a<b<3000000).
Output
Output the result of (a)+ (a+1)+....+ (b)

 

Sample Input
3 100
Sample Output
3042

         题目大意:输入a和b,求a~b直接的欧拉值,要用到筛法欧拉函数,直接欧拉函数会超时,数据很大,不多说。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824

代码:

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <math.h>
using namespace std;

const int N = 3000005;

int prime[N];
int phi[N];
bool is_prime[N];

void get_phi()
{
    int i, j, k;
    k = 0;
    for(i = 2; i < N; i++)
    {
        if(is_prime[i] == false)
        {
            prime[k++] = i;
            phi[i] = i-1;
        }
        for(j = 0; j<k && i*prime[j]<N; j++)
        {
            is_prime[ i*prime[j] ] = true;
            if(i%prime[j] == 0)
            {
                phi[ i*prime[j] ] = phi[i] * prime[j];
                break;
            }
            else
            {
                phi[ i*prime[j] ] = phi[i] * (prime[j]-1);
            }
        }
    }
}

int main()
{
    long long sum;
    int i, x, y;
    get_phi();
    while(scanf("%d %d", &x, &y) != EOF)
    {
        sum = 0;
        for(i = x; i <= y; i++)
        {
            sum += phi[i];
        }
        printf("%I64d\n", sum);
    }

    return 0;
}

0
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics