定义:欧拉函数
定理:求解欧拉函数的值可用如下定理实现(通过n的素因子分解)
算法实现:
(一)直接实现:直接套用定理求解欧拉函数值
ll phi(ll n)
{
ll res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
res=res-res/i;
do{
n/=i;
}while(n%i==0);
}
}
if(n>1) res=res-res/n;
return res;
}
poj 2407:Relatives
题目链接:http://poj.org/problem?id=2407
解题思路:裸求欧拉函数,直接调用函数
参考代码:
#include
#include
#include
#include
(二)打素数表:
(三)递推求欧拉函数:欧拉函数值打表
void init()
{
for(int i=1;i<=maxn;i++) phi[i]=i;
for(int i=2;i<=maxn;i+=2) phi[i]/=2;
for(int i=3;i<=maxn;i+=2)
if(phi[i]==i){
for(int j=i;j<=maxn;j+=i)
phi[j]=phi[j]/i*(i-1);
}
}
poj 1284:Primitive Roots
定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根
所以原问题转化为求欧拉函数φ(p-1);参考代码(采用递推法打表求欧拉函数)
#include
#include
#include
#include
poj 2478:Farey Sequence
解题思路:
Fn=2,3,4,5,……,n-1,n互素的数的个数,进而求2到n欧拉函数值的和;欧拉函数值通过递推打表求解,2~n的和也可以通过打表预处理实现。
参考代码:
#include
#include
#include
#include
poj 3090: Visible Lattice Points
解题思路:求不可约数对(x,y),即x,y互素,即求1到n欧拉函数值的和,在根据对称性2*sum+1即为所求。
参考代码:(与poj 2478 类似)
#include
#include
#include
#include
poj 3696:The Luckiest number(数论好题)
解题思路:
参考题解:http://www.cppblog.com/menjitianya/archive/2014/06/28/207449.html
参考代码:
#include
#include
#include
#include
poj 3358:Period of an Infinite Binary Expansion(数论好题)
解题思路:
参考代码:
#include
#include
#include
#include