两种晒发+1中单个查询
const int maxn=1500000;
int a[maxn];
void Init_oula()///预处理求出1到N的欧拉函数的值
{
int i,j;
memset ( a, 0 ,sizeof (a)) ;
for ( i = 2 ; i <= N ; i ++ )
{//筛选求a
if ( ! a[i] )
{
for ( j = i ; j <= N ; j += i )
{
if ( ! a[j] )
a[j ] = j ;
a[j] = a[j] / i * ( i - 1 ) ;
}
}
}
}
///二 O(n*ln(n))
void Init_oula()
{
for(itn i=1;i<=maxn;i++)
a[i]=i;
for(itn i=2;i<=maxn;i+=2)
a[i]/=2;
for(int i=3;i<=maxn;i+=2)
{
if(a[i]==i)
for(int j=i;j<=maxn;j+=i)
a[i]=a[i]/i*(i-1);
}
}
<pre name="code" class="cpp">int oula(int n)
{
int nn=n;
for(int i=0; prime[i]*prime[i]<=n; i++)
{
if(n%prime[i]==0)
{
nn=nn-nn/prime[i];
while(n%prime[i]==0)
n/=prime[i];
}
}
if(n>1)
nn=nn-nn/n;
return nn;
}