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