现在的位置: 首页 > 综合 > 正文

Hdu 2824 The Euler function

2017年05月28日 ⁄ 综合 ⁄ 共 547字 ⁄ 字号 评论关闭

题目链接:点击打开链接

题意很简单:求a到b之间所有数的欧拉值。

递推求数据范围内的所有的欧拉值。求一个前缀数组。直接取值就好。

10640776 2014-04-28 20:02:17 Accepted 2824 484MS 23740K 562 B C++ nyist_张开创

跪求62MS大神的解法。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define LL __int64

const int N=3*1e6+7;
LL e[N];
void Euler2(){
    LL i,j;
    for(i=1;i<=N-7;i++) e[i] = i;
    for(i=2;i<=N-7;i+=2) e[i] /= 2;
    for(i=3;i<=N-7;i+=2)
    if(e[i]==i){
        for(j=i;j<=N-7;j+=i)
        e[j]=e[j]/i*(i-1);
    }
    for(int i=2;i<=N-7;i++)
    e[i]+=e[i-1];
}

int main(){
    Euler2();
    LL a,b;
    while(~scanf("%I64d%I64d",&a,&b)){
        printf("%I64d\n",e[b]-e[a-1]);
    }
    return 0;
}

抱歉!评论已关闭.