码迷,mamicode.com
首页 > 其他好文 > 详细

poj3090Visible Lattice Points

时间:2015-08-16 23:15:06      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:acm   poj   

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

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

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

#include<stdio.h>
#include<stdlib.h>

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<stdio.h>
#include<stdlib.h>

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 ++;
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj3090Visible Lattice Points

标签:acm   poj   

原文地址:http://blog.csdn.net/ibigprogramer/article/details/47706701

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!