USACO 1.4 Arithmetic Progressions(枚举)

好纠结的。。。复杂度很高,开始的方法太暴力了,后来搞了一个 快了一点的枚举办法,水过了。。

 1 /*
 2 ID: cuizhe
 3 LANG: C++
 4 TASK: ariprog
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <cmath>
 9 #include <algorithm>
10 #include <ctime>
11 using namespace std;
12 #define LL long long
13 int p[1250001],o[1250001];
14 struct node
15 {
16    int x,y;
17 }que[100001];
18 int cmp(const node &a,const node &b)
19 {
20     if(a.y < b.y)
21     return 1;
22     else if(a.y > b.y)
23     return 0;
24     else if(a.x < b.x)
25     return 1;
26     else
27     return 0;
28 }
29 int main()
30 {
31     int i,j,k,n,m,num,t,dis;
32     freopen("ariprog.in","r",stdin);
33     freopen("ariprog.out","w",stdout);
34     scanf("%d%d",&n,&m);
35     num = 1;
36     for(i = 0;i <= m;i ++)
37     {
38         for(j = 0;j <= m;j ++)
39         {
40             if(!o[i*i+j*j])
41             {
42                 p[num ++] = i*i+j*j;
43                 o[i*i+j*j] = 1;
44             }
45         }
46     }
47     sort(p+1,p+num);
48     t = 1;
49     for(i = 1;i <= num-n;i ++)
50     {
51        for(j = i+1;j <= num-1;j ++)
52        {
53            dis = p[j] - p[i];
54            for(k = 2;k <= n-1;k ++)
55            {
56                if(dis*k+p[i] > p[num-1])
57                break;
58                if(!o[dis*k+p[i]])
59                {
60                    break;
61                }
62            }
63            if(k == n)
64            {
65                que[t].x = p[i];
66                que[t].y = dis;
67                t ++;
68            }
69        }
70     }
71     sort(que+1,que+t,cmp);
72     for(i = 1;i <= t-1;i ++)
73     printf("%d %d\n",que[i].x,que[i].y);
74     if(t == 1)
75     printf("NONE\n");
76     return 0;
77 }
posted @ 2012-11-01 18:42  Naix_x  阅读(154)  评论(0编辑  收藏  举报