在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)
通式:
ps:那个不认识的符号是累乘 …… 卑微
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(和1互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=223那么φ(12)=φ(4 * 3)=φ(2 ^ 2 * 3 ^ 1)=(2 ^ 2-2 ^ 1)*(3 ^ 1-3 ^ 0)=4
若n是质数p的k次幂, ,因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是积性函数——若m,n互质,
特殊性质:当n为奇质数时, , 证明与上述类似。
若n为质数则
//标程 //欧拉函数 #include<iostream> #include<cstdio> using namespace std; #define ll long long int #define MAX 2000000+5 int euler[MAX]; void Euler(){ for(int i=2;i<MAX;i++) euler[i] = i; for(int i=2;i<MAX;i++){ if(euler[i]==i) for(int j=i;j<MAX;j+=i) euler[j] = euler[j]/i*(i-1); } } int main(){ Euler(); int n; euler[1] = 1;//这里要初始化euler[1] = 1; for(int i = 0;i < 20;i++) { cout<<euler[i]<<endl; } return 0; }
例题:
#include<iostream> #include<cstdio> using namespace std; #define ll long long int const int MAX = 1000010; int euler[MAX]; void Euler(){ for(int i=2;i<MAX;i++) euler[i] = i; for(int i=2;i<MAX;i++){ if(euler[i]==i) for(int j=i;j<MAX;j+=i) euler[j] = euler[j]/i*(i-1); } } int main(){ Euler(); int T,n,a,cnt=1; ll ans; scanf("%d",&T); while(T--){ ans = 0; scanf("%d",&n); while(n--){ scanf("%d",&a); for(int i=a+1;;i++) if(euler[i]>=a){ ans+=i; break; } } printf("Case %d: %lld Xukha\n",cnt,ans); cnt++; } return 0; }