http://acm.hdu.edu.cn/showproblem.php?pid=1286
本来可以直接用普通的欧拉函数,但是,这个那样非常容易TLE,所以用素数筛法+欧拉函数;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std ;
#define maxn 100005
int prime[ maxn + 1 ] ;
int ans[ maxn + 1] ;
void Prime()
{
int i , j ;
memset( prime , 0 , sizeof( prime ) );
prime[ 0 ] = prime[ 1 ] = 1;
for( i = 2 ; i * i <= maxn ; ++i )
{
if( !prime[ i ] )
{
for( j = i * i ; j <= maxn ; j += i )
prime[ j ] = 1 ;
}
}
}
void enlerfun()
{
int i , j ;
for( i = 1 ; i <= maxn ; ++i )
ans[ i ] = i ;
for( i = 2 ; i <= maxn ; ++i )
{
if( !prime[ i ] )
{
for( j = i ; j <= maxn ; j += i )
ans[ j ] = ans[ j ] / i * ( i - 1 ) ;
}
}
}
int main()
{
int Case , n ;
Prime();
enlerfun();
cin >> Case ;
while( Case-- )
{
cin >> n ;
cout << ans[ n ] << endl ;
}
return 0 ;
}