这是一道简单的筛选加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] ;
}
}