含义
欧拉函数:phi(n) 1-n这个区间里面和n互质的个数有多少个
公式
先化解出最简质因子乘式
n=p1^a1*p2*a2.....*px^ax
那么就是公式就是
phi(n)=n*((p1-1)/p1)*((p2-1)/p2)....((px-1)/px)=n*(1-1/p1)*(1-1/p2).....(1-1/px)
解析
首先我们为什么是这个公式呢,首先要求互质,那么就说明化成最简公式后,两个数之间没有相同的质因子
那么我们算下1-n中有多少个又p1这个因子,那么个数就是n/p1,算有多少个p2因子的数也是一样的道理
但是我们要还要加上我们删两次的数,也就是包含p1*p2因子的数,所以我们公式也就是
假设只有这两个质因子,那么
phi(n)=n-n/p1-n/p2+n/(p1*p2) = n*(1-1/p1-1/p2+1/(p1*p2)) = n*(1-1/p1)*(1-1/p2)
这就化成了公式,这只是两个数的情况,当然这扩展到多个数是一样的,中间就是用了容斥定理
所以我们写代码的时候只要求出n所有的质因子即可
#include<cstdio> #include<iostream> #include<cmath> #define maxn 200005 #define mod 1000000007 using namespace std; typedef long long ll; typedef unsigned long long ull; ll n; ll phi(ll x){ ll sum=x; for(int i=2;i<=sqrt(x);i++){ if(x%i==0){ sum=sum/i*(i-1); while(x%i==0) x/=i;//把i因子都除尽,因为每个质因子还有次方,我们要全部除掉 } } if(x>1) sum=sum/x*(x-1);//最后这个质因子有可能超过sqrt,所以没有被除到 return sum; } int main(){ while(cin>>n){ cout<<phi(n)<<" "; } }
欧拉函数两条性质
1,n>1时,1-n中与n互质的数的和为 n*phi(n)/2;
解释:因为gcd(n,x) = gcd(n,n-x) 所以当gcd(n,x)=1 n和x互质时 那么说明 n和n-x肯定也互质 ,所以都是成对出现的 一对加起来就是n,这样一平均就是每个数的和为n/2
2,phi(a*b) = phi(a)*phi(b)
解释:因为化简成最简式子后是一样的