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\n",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\n",num);

41     }

42     return 0;

43 }

 

 

你可能感兴趣的:(function)