zoukankan      html  css  js  c++  java
  • 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): 2986    Accepted Submission(s): 1221


    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
     
    第一种打表的方法是,素数和欧拉,分开来打表。250ms
    第二种打表只有一个,但是时间上更多。500ms
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 
     8 int prime[3000003],len;
     9 int   opl[3000003];
    10 bool s[3000003];
    11 
    12 void Getprime() //打素数表
    13 {
    14     int i,j;
    15     len=0;
    16     for(i=2;i<=3000000;i++)
    17     {
    18         if(s[i]==false)
    19         {
    20             prime[++len]=i;
    21             for(j=i*2;j<=3000000;j=j+i)
    22             s[j]=true;
    23         }
    24     }
    25 }
    26 
    27 void Euler() //欧拉打表。
    28 {
    29     int i,j;
    30     Getprime();
    31     for(i=2;i<=3000000;i++)
    32     opl[i]=i;
    33     opl[1]=0;
    34     for(i=1;i<=len;i++)
    35     {
    36         for(j=prime[i];j<=3000000;j=j+prime[i])
    37         opl[j]=opl[j]/prime[i]*(prime[i]-1); //利用的定理
    38 
    39     }
    40 }
    41 
    42 int main()
    43 {
    44     int n,m,i;
    45     __int64 num;
    46     Euler();
    47     while(scanf("%d%d",&n,&m)>0)
    48     {
    49         num=0;
    50         for(i=n;i<=m;i++)
    51         num=num+opl[i];
    52         printf("%I64d
    ",num);
    53     }
    54     return 0;
    55 }

     第二种方法。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 
     8 int   opl[3000003];
     9 bool s[3000003];
    10 
    11 
    12 void Euler() //欧拉打表。
    13 {
    14     int i,j;
    15     for(i=2;i<=3000000;i++)
    16     opl[i]=i;
    17     opl[1]=0;
    18 
    19     for(i=2;i<=3000000;i++)
    20     if(s[i]==false)
    21     {
    22         for(j=i;j<=3000000;j=j+i)
    23         {
    24             opl[j]=opl[j]/i*(i-1);
    25             s[j]=true;
    26         }
    27     }
    28 }
    29 
    30 int main()
    31 {
    32     int n,m,i;
    33     __int64 num;
    34     Euler();
    35     while(scanf("%d%d",&n,&m)>0)
    36     {
    37         num=0;
    38         for(i=n;i<=m;i++)
    39         num=num+opl[i];
    40         printf("%I64d
    ",num);
    41     }
    42     return 0;
    43 }
     
  • 相关阅读:
    win server 2012 服务器不能ping通
    Linux系统的文件目录结构
    怎样理解和识别 Linux 中的文件类型
    Linux(Centos 7)下安装Git并配置连接GitHub
    centos 7 下升级自带 sqlite3
    Pycharm项目上传到Github
    计算机存储单位:bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB
    ubuntu 删除命令
    influxDB 各个历史版本号,时间截止2020年9月27日
    使用Github做一个完全免费的个人网站
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3243535.html
Copyright © 2011-2022 走看看