Reimpreso de https://www.cnblogs.com/handsomecui/p/4755455.html
Plantilla de función de Euler La función de
Euler debe ser un número par
(1) Encuentre directamente el número de menor o igual an y relativamente primo an :
int Euler (int n)
{
int ret=n;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
{
ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
while(n%i==0)
n/=i;
}
if(n>1)
ret=ret/n*(n-1);
return ret;
}
//
ll phi (ll n) // encuentra el valor de la función de Euler
{
int ans = n, temp = n;
for (int i = 2; i * i <= temp; i ++)
{
if (temp% i0)
{
ans- = ans / i;
mientras (temp% i0) temp / = i;
}
}
if (temp> 1) ans- = ans / temp;
return ans;
}
Plantilla de cribado: encuentre el número de factores primos de cada número entre [1, n]
#define tamaño 1000001
int euler [tamaño];
Inicialización vacía ()
{
memset(euler,0,sizeof(euler));
euler[1]=1;
for(int i=2;i<size;i++)
if(!euler[i])
for(int j=i;j<size;j+=i)
{
if(!euler[j])
euler[j]=j;
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
}