博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2824 The Euler function --------欧拉模板
阅读量:5742 次
发布时间:2019-06-18

本文共 2657 字,大约阅读时间需要 8 分钟。

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
2 #include
3 #include
4 #include
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
2 #include
3 #include
4 #include
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 }

 

 

转载于:https://www.cnblogs.com/tom987690183/p/3243535.html

你可能感兴趣的文章
Release和Debug的区别[转]
查看>>
oracle11g 数据库导出报“ EXP-00003:
查看>>
机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...
查看>>
Luogu_2876_[USACO07JAN]解决问题Problem Solving
查看>>
Oracle RAC 并发与架构
查看>>
136. Single Number
查看>>
web前端开发教程系列-2 - 前端开发书籍分享(转)
查看>>
linux常用命令 print格式输出
查看>>
count-the-repetitions
查看>>
代码分享h5-sessionStorage,提示app下载代码块
查看>>
pl/sql developer 中文字段显示乱码( 转载)
查看>>
location.href语句与火狐不兼容的问题
查看>>
eclipse中git的使用
查看>>
ajax请求
查看>>
django orm
查看>>
python中的 == 和 is
查看>>
检查密码复杂度的C#正则表达式
查看>>
C# 中 async/await 调用传统 Begin/End 异步方法
查看>>
C# 为什么使用了多线程界面假死?
查看>>
ConfigParser模块&hashlib模块&subprocess模块
查看>>