• HDU2824 The Euler function(欧拉函数)


    题目求φ(a)+φ(a+1)+...+φ(b-1)+φ(b)。

    用欧拉筛选法O(n)计算出n以内的φ值,存个前缀和即可。

    • φ(p)=p-1(p是质数),小于这个质数且与其互质的个数就是p-1;
    • φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a),因为欧拉函数是积性函数,φ(p*a)=φ(p)*φ(a);
    • φ(p*a)=p*φ(a)(p是质数且p|a),不知怎么理解。。
     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 #define MAXN 3000000
     5 long long phi[MAXN];
     6 int prime[MAXN];
     7 bool vis[MAXN];
     8 void euler(){
     9     phi[1]=1;
    10     int tot=0;
    11     for(long long i=2; i<MAXN; ++i){
    12         if(!vis[i]){
    13             prime[tot++]=i;
    14             phi[i]=i-1;
    15         }
    16         for(int j=0; j<tot; ++j){
    17             if(i*prime[j]>MAXN) break;
    18             vis[i*prime[j]]=1;
    19             if(i%prime[j]==0){
    20                 phi[i*prime[j]]=phi[i]*prime[j];
    21                 break;
    22             }else{
    23                 phi[i*prime[j]]=phi[i]*(prime[j]-1);
    24             }
    25         }
    26     }
    27 }
    28 int main(){
    29     euler();
    30     for(int i=2; i<MAXN; ++i) phi[i]+=phi[i-1];
    31     int a,b;
    32     while(~scanf("%d%d",&a,&b)){
    33         printf("%lld
    ",phi[b]-phi[a-1]);
    34     }
    35     return 0;
    36 } 
  • 相关阅读:
    转:浅谈Linux的内存管理机制
    (转)Redis
    检测socket链接是否断开
    linux C 中的volatile使用
    LINUX 下 ipv6 socket 编程
    linux signal 列表
    Linux下异常信号
    linux signal
    转: 关于Linux常用的二进制文件分析方法
    IOI2020 题解
  • 原文地址:https://www.cnblogs.com/WABoss/p/5183665.html
Copyright © 2020-2023  润新知