새로운 친구 찾기

http://acm.hdu.edu.cn/showproblem.php?pid=1286
원래 일반적인 오로라 함 수 를 직접 사용 할 수 있 었 는데, 이것 은 TLE 가 매우 쉬 워 서 소수 체 법 + 오로라 함 수 를 사용 합 니 다.
#include
#include
#include
#include

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 ;
}

좋은 웹페이지 즐겨찾기