poj3090Visible Lattice Points

3 篇文章 0 订阅

原题链接: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 ++;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值