hdu 2824 The Euler function(筛法欧拉函数)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > hdu 2824 The Euler function(筛法欧拉函数)

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

 2011/12/5 7:35:06  gzhu_101majia  http://gzhu-101majia.iteye.com  我要评论(0)
  • 摘要:TheEulerfunctionTimeLimit:2000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):1111AcceptedSubmission(s):466ProblemDescriptionTheEulerfunctionphiisanimportantkindoffunctioninnumbertheory,(n
  • 标签:函数 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;
}

发表评论
用户名: 匿名