这是一道简单的筛选加DP的题
用到了素数筛选法的
一开始没有注意输入的CASE数有1000组,在筛选了之后做了n次的暴力查找
结果TLE了,后来改了DP,但是却把它放到循环体里面了,结果又T了,可惜啊,
后来0.03过了的,重新读一下题目,发现其实只要做半个矩形就行了
#include
"
stdio.h
"
#include < string .h >
bool point[ 1002 ][ 1002 ] ;
int ans[ 1002 ][ 1002 ] ;
void inti() ;
void DP() ;
int main ( void )
... {
inti() ;
DP() ;
int T, n, m ;
scanf ( "%d", &T ) ;
for ( m = 1 ; m <= T ; m++ ) ...{
scanf ( "%d", &n ) ;
printf ( "%d %d %d ", m, n, ans[n][n]*2+1 ) ;
}
return 0 ;
}
void inti()
... {
int i, j ;
memset(point,true,sizeof(point)) ;
point[0][0] = false ;
for ( i = 0 ; i <= 500 ; i++ ) ...{
for ( j = 0 ; j <= i ; j++ ) ...{
if ( point[i][j] ) ...{
int a = i+i, b = j+j ;
while ( a < 1001 && b < 1001 ) ...{
point[a][b] = false ;
a += i ; b += j ;
}
}
}
}
}
void DP()
... {
int i, j ;
ans[0][0] = 0 ;ans[0][1] = 0 ;
for ( i = 1 ; i <= 1000 ; i++ ) ...{
ans[i][i+1] = 0 ;
ans[i][0] = 1 ;
}
for ( i = 1 ; i <= 1000 ; i++ ) ...{
for ( j = 0 ; j < i ; j++ ) ...{
ans[i][j] = ans[i-1][j] + ans[i][j-1] - ans[i-1][j-1] ;
if ( point[i][j] ) ans[i][j] ++ ;
}
ans[i][j] = ans[i][j-1] ;
}
}
#include < string .h >
bool point[ 1002 ][ 1002 ] ;
int ans[ 1002 ][ 1002 ] ;
void inti() ;
void DP() ;
int main ( void )
... {
inti() ;
DP() ;
int T, n, m ;
scanf ( "%d", &T ) ;
for ( m = 1 ; m <= T ; m++ ) ...{
scanf ( "%d", &n ) ;
printf ( "%d %d %d ", m, n, ans[n][n]*2+1 ) ;
}
return 0 ;
}
void inti()
... {
int i, j ;
memset(point,true,sizeof(point)) ;
point[0][0] = false ;
for ( i = 0 ; i <= 500 ; i++ ) ...{
for ( j = 0 ; j <= i ; j++ ) ...{
if ( point[i][j] ) ...{
int a = i+i, b = j+j ;
while ( a < 1001 && b < 1001 ) ...{
point[a][b] = false ;
a += i ; b += j ;
}
}
}
}
}
void DP()
... {
int i, j ;
ans[0][0] = 0 ;ans[0][1] = 0 ;
for ( i = 1 ; i <= 1000 ; i++ ) ...{
ans[i][i+1] = 0 ;
ans[i][0] = 1 ;
}
for ( i = 1 ; i <= 1000 ; i++ ) ...{
for ( j = 0 ; j < i ; j++ ) ...{
ans[i][j] = ans[i-1][j] + ans[i][j-1] - ans[i-1][j-1] ;
if ( point[i][j] ) ans[i][j] ++ ;
}
ans[i][j] = ans[i][j-1] ;
}
}