ZOJ2777

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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值