欧拉函数
2018-10-03 17:57:01来源:博客园 阅读 ()
欧拉函数:(转自百度百科)
欧拉函数F(x)的作用:求从1到x与x互质的数的个数。
直接求欧拉函数
int euler(int n)//计算与n互质的数的个数 { int res = n,maxn = n; for(int i=2;i*i < maxn;i++) { if(n % i == 0) { res = res / i * (i-1); while(n % i == 0)//去除n中所有的i的倍数 n /= i; } } if(n > 1)//最后还剩一个因子,也要算上 res = res / n * (n-1); return res; }
对一段区间内的数进行求欧拉函数,并打表
int euler[maxn]; void init(int maxn) { euler[1] = 1; for(int i=2;i < maxn;i++) euler[i] = i; for(int i=2;i < maxn;i++) { if(euler[i] == i) { for(int j=i;j < maxn;j++)//对所有包含质因数i的数进行求欧拉函数值 { euler[j] = euler[j] / i * (i-1);//先进行除法,是为了防止中间有数据溢出 } } } return ; }
点击打开链接UVA10820
题意:给出一个数n,问从1到n有多少对互质的数
HINT:(1,1)是互质的;
连续卡了几天的欧拉函数,在今天终于顿悟,虽然然不是很透彻,赶紧记下来,哈哈哈哈。。
这个题找到一对互质的数后,记得将他们两个互换也是符合条件的。这样求出总的互质的对数后乘以2就OK了。
等等!!!有个小坑就是(1,1)互换后是一样的。。。。。额,有点小尴尬。没事最后的数减去1就OK了。
上代码:
#include <cstdio> #include <iostream> #include <iomanip> #include <vector> #include <cstring> using namespace std; const int maxn = 50010; int buf[maxn]; void init() { memset(buf,0,sizeof(buf)); buf[1] = 1;//边筛选素数,边计算合数的欧拉函数 for(int i=2; i <= maxn; i++) //当前的数是被筛到的数的质因子,当buf[i]为0是,代表buf[i]是素数 { if(buf[i] == 0)//如果该数是素数 { for(int j=i; j <= maxn; j+=i)//找到质因子中包含该数的合数 { if(buf[j] == 0) buf[j] = j; //计算合数的欧拉函数 buf[j] = buf[j]/i*(i-1); } } } for(int i=2;i <= maxn;i++) { //printf("buf[i-1]: %d ",buf[i-1]); buf[i] += buf[i-1]; } //printf("buf[2]:%d\n",buf[2]); } int main() { int n; init(); while(scanf("%d",&n) && n) { printf("%d\n",2*buf[n]-1); } return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ const成员函数 2020-06-03
- C++ 析构函数 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash