欧拉函数[已解决]
2015-08-15 01:32
253 查看
起因:[UVA 10820]Send a Table
疑问:关于欧拉函数的(nloglogn)算法。在代码中的部分,不明白为什么这样就可以求出欧拉函数的值
更新:2015.08.24
首先是关于phi数组的定义:小于i且与i互为素数的整数的个数
i 的唯一分解式 : i = p1^a1*p2^a2*p3^a3......(p1 ... pn均为素数)
然后是普通求法是根据容斥原理:phi[i] = i - i / p1 - i / p2 - ...... + i / p1p2 + i / p1p3 + ......
最终简化成:phi[i] = i*( 1 - 1/p1)*(1 - 1/p2)*.......
展开式的每一项,相当于每一次选择1或者-1/pi进行运算,即又变成了未简化前的式子
疑问:关于欧拉函数的(nloglogn)算法。在代码中的部分,不明白为什么这样就可以求出欧拉函数的值
phi[1] = 1; for (int i = 2; i <= 50001; ++i) if (!phi[i]) { for (int j = i; j <= 50001; j += i)//这一块地方 { if (!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i - 1); } }
更新:2015.08.24
首先是关于phi数组的定义:小于i且与i互为素数的整数的个数
i 的唯一分解式 : i = p1^a1*p2^a2*p3^a3......(p1 ... pn均为素数)
然后是普通求法是根据容斥原理:phi[i] = i - i / p1 - i / p2 - ...... + i / p1p2 + i / p1p3 + ......
最终简化成:phi[i] = i*( 1 - 1/p1)*(1 - 1/p2)*.......
展开式的每一项,相当于每一次选择1或者-1/pi进行运算,即又变成了未简化前的式子
//注意到简化式中,phi = i*( 1 - 1/p1)*(1 - 1/p2)*...... //在内层循环里枚举素数的倍数,素数倍数的简化式和本身的简化式 //区别在于两处:第一、i的不同;第二、如果本身乘的倍数是素数, //那么这个倍数就会添加到phi的公式中,即多出来一个(1 - 1/p) //嘛,这就是原理~ phi[1] = 1; for (int i = 2; i <= 50001; ++i) if (!phi[i]) { for (int j = i; j <= 50001; j += i) { if (!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i - 1); } }
相关文章推荐
- MSP430WARE++的使用1:LG3641BH driver的调用方法
- 整理了一些犬细小病毒用药仅供参考
- Win32汇编--02必须了解的基础知识
- 编写最简单的内核:HelloWorld
- mac使用过程总结
- leetcode 字符串
- Mac 系统下vbox 的双网卡配置
- [机器学习]content-based recommendation
- tableView-自定义非等高cell(2)
- mac apache vhost 配置时出现的 404
- AutoBundle in asp.net mvc 5
- VS动态链接库隐式创建和调用
- 程序的编译、链接与装载
- 利用HTTP-only Cookie缓解XSS
- HDU 1556 Color the ball 线段树
- HDU 5384 Danganronpa(AC自动机)
- tableView-自定义非等高cell(1)
- 菜单状态更新
- ArcGIS地质图矢量化技巧概要
- [置顶] Genymotion 出现the number of cpus of the virtual device has been forced to be 1的解决方法