One: Directly seeking Euler function
#include <cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespacestd;intMainvoid){ intN; while(~SCANF ("%d",&N)) {intAns =N; intm = sqrt (n+0.5); for(inti =2; I <= m; i++) { if(n==1) Break; if(n%i==0) {ans= ans/i* (I-1); while(n%i==0) n= N/i; } } if(n!=1) ans= ans/n* (n1); printf ("%d\n", ans); } return 0;}
Second: Play the table
#include <cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespacestd;Const intMAXN = -;intEULER[MAXN];voidInit () {euler[1]=1; for(inti =2; I <= MAXN; i++) Euler[i]=i; for(inti =2; I <= MAXN; i++) if(euler[i]==i) for(intj = i; J <= Maxn; j+=i) euler[j]=euler[j]/i* (I-1);//Division first to prevent overflow of intermediate data}intMainvoid) {Init (); for(inti =1; I <= MAXN; i++) {printf ("%d%d\n", I,euler[i]); } return 0;}
Three: The linear sieve method of Euler's function
Principle:1: If P is prime, then φ (p) =p-1;
2: If i%p==0, then φ (i*p) =p*φ (i);
3: If i%p!=0, then φ (i*p) =φ (i) * (p-1)
#include <cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespacestd;Const intMAXN = -;intBOOK[MAXN];intPRIME[MAXN];intPHI[MAXN];intnum;voidInit () {memset (book,0,sizeof(book)); phi[1] =1; book[0] =1; book[1] =1; for(inti =2; I <= MAXN; i++) { if(book[i]==0) {Prime[num++] =i; Phi[i]= i-1; } for(intj =0; J < num; J + +) { intp =Prime[j]; if(I * p >MAXN) Break; Book[i* p] =1; Phi[i* p] = (i% p = =0? Phi[i] * p:phi[i] * (P-1)); if(i% P = =0) Break; } }}intMainvoid) {Init (); for(inti =1; i < MAXN; i++) printf ("%d%d\n", I,phi[i]); return 0;}
Number theory-Euler functions