Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > C/C PLUSPLUS > » 正文

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

来源: gzhu_101majia 分享至:

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;
}


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史