题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1978
由于要搞最大公约数,那么就直接sqrt(a[i])枚举约数即可,然后开一个桶来优化一下,复杂度就成了O( n sqrt( a ) )
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std ;
#define maxa 1001000
#define maxn 50010
#define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
int Max[ maxa ] , f[ maxn ] , n , a[ maxn ] , ans = 0 ;
int b[ maxn ] , bn , l ;
int main( ) {
memset( Max , 0 , sizeof( Max ) ) ;
memset( f , 0 , sizeof( f ) ) ;
scanf( "%d%d" , &n , &l ) ;
rep( i , n ) scanf( "%d" , a + i ) ;
rep( i , n ) {
bn = 0 ;
int len = int( sqrt( a[ i ] ) ) ;
rep( j , len ) if ( ! ( a[ i ] % j ) ) {
b[ ++ bn ] = j ;
if ( a[ i ] / j != j ) b[ ++ bn ] = a[ i ] / j ;
}
rep( j , bn ) if ( b[ j ] >= l ) f[ i ] = max( f[ i ] , Max[ b[ j ] ] ) ;
ans = max( ans , ++ f[ i ] ) ;
rep( j , bn ) Max[ b[ j ] ] = max( Max[ b[ j ] ] , f[ i ] ) ;
}
printf( "%d\n" , ans ) ;
return 0 ;
}