poj3090Visible Lattice Points

原题链接:http://poj.org/problem?id=3090

题目大意:行数与列数互质,星星就可见。矩阵对称,只需检查一半。

第一次未做特殊处理,复杂度是1000*1000*1000,TLE。

#include
#include

int GCD(int a,int b)
{
	if(b == 0)
		return a;
	else
		return GCD(b,a%b);
}
int main(void)
{
    int casenum,n,i,j,sum,count = 1;
    scanf("%d",&casenum);
    while(casenum --)
    {
        scanf("%d",&n);
        sum = 0;
        for(i = 0;i <= n;i ++)
        {
            for(j = 0;j <= i;j ++)
            {
                //if(check(i,j))
                  //  sum ++;
                  if(GCD(i,j) == 1)
                    sum ++;
            }
        }
        sum = sum * 2 - 1;
        printf("%d %d %d\n",count ++,n,sum);
    }
}
第二次做了一些处理,将之前已经测试过的结果保存下来,之后的数据如果大于之前的,可以从之前的结果出继续下去。

#include
#include

int sum[1001];
int GCD(int a,int b)
{
	if(b == 0)
		return a;
	else
		return GCD(b,a%b);
}
void init()
 {
     int i;
     for(i = 0;i <= 1000;i ++)
        sum[i] = 0;
    sum[1] = 2;
 }
int main(void)
{
    int casenum,n,i,j,k,count = 1;
    init();
    scanf("%d",&casenum);
    while(casenum --)
    {
        scanf("%d",&n);
        if(sum[n] == 0){
            for(k = n;k >= 1;k --)
            {
                if(sum[k])                     
                    break;
            }
            sum[n] += sum[k];
            for(i = k+1;i <= n;i ++)
            {
                for(j = 0;j <= i;j ++)
                {
                    if(GCD(i,j) == 1){
                            sum[n] ++;
                    }
                }
            }
        }
        printf("%d %d %d\n",count,n,sum[n]* 2 -1);
        count ++;
    }
}


你可能感兴趣的:(ACM,poj)