原题链接: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 ++; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ibigprogramer/article/details/47706701