Cod sursa(job #355256)

Utilizator alutzuAlexandru Stoica alutzu Data 10 octombrie 2009 15:12:32
Problema Divizori Primi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<cstdio>
#include<vector>

using namespace std ;
const int NMAX = 1<<20 ;

int a[8][1<<19] ;

short int  v [ NMAX ] ;

void preg ( )
{
	int i , j ;
	for ( i = 2 ; i <= NMAX ; i ++ )
		if ( v[i] == 0 )
			for ( j = i ; j <= NMAX ; j += i )
				v[j] ++ ;
	for ( i = 2 ; i <= NMAX ; i ++ )
		a [ v[i] ] [++a[v[i]][0]] = i ;
}

int caut ( int val , int x[] , int n  )
{
	int pas = 1 << 19 , i ;
	for ( i = 0 ; pas ; pas >>=1 )
		if ( i+pas <= n && x[i+pas] <= val )
			i+= pas ;
	if ( x[i] > val ) return 0 ;
	return x[i] ;
}

int main ( ) 
{
	freopen ( "divprim.in" , "r" , stdin ) ;
	freopen ( "divprim.out" , "w" , stdout ) ;
	
	int T , n , k , i ;
	
	scanf ( "%d" , & T ) ;
	preg ( ) ;
	for ( i = 1 ; i <= T ; i ++ )
	{
		scanf ( "%d%d" , & n , & k ) ;
		printf ( "%d\n" , caut ( n , a[k] , a[k][0]) ) ;
	}
	
	return 0 ;
}