usaco1.4.3——ariprog

Arithmetic Progressions 等差数列

描述

一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列。

在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合S中长度为n的等差数列。双平方数集合是所有能表示成p^2+q^2的数的集合。

格式

TIME LIMIT: 5 秒

PROGRAM NAME: ariprog

INPUT FORMAT:

(file ariprog.in)

第一行: N(3<= N<=25),要找的等差数列的长度。

第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。

OUTPUT FORMAT:

(file ariprog.out)

如果没有找到数列,输出`NONE'。

如果找到了,输出一行或多行, 每行由二个整数组成:a,b。

这些行应该先按b排序再按a排序。

所求的等差数列将不会多于10,000个。

SAMPLE INPUT

5

7

SAMPLE OUTPUT

1 4

37 4

2 8

29 8

1 12

5 12

13 12

17 12

5 20

2 24

 

时限相当宽泛啊。。。

看我的评测结果(基本暴力。。。。)

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 664 KB]
   Test 2: TEST OK [0.000 secs, 664 KB]
   Test 3: TEST OK [0.000 secs, 664 KB]
   Test 4: TEST OK [0.000 secs, 664 KB]
   Test 5: TEST OK [0.027 secs, 664 KB]
   Test 6: TEST OK [0.189 secs, 664 KB]
   Test 7: TEST OK [2.025 secs, 664 KB]
   Test 8: TEST OK [4.590 secs, 664 KB]
   Test 9: TEST OK [4.212 secs, 664 KB]

All tests OK.

Your program ('ariprog') produced all correct answers! This is your submission #2 for this problem. Congratulations!

第八个点相当的惊险。。。

 

可能有人看到了我那个是第二次提交才过的。。。。

错误出在我没审清题,忽略了无解的情况,结果第三个点悲剧了。。。

 

具体点的我做这题的思路:

先是枚举p,q,把所有可能的双平方数标记,

再分别枚举a和b,然后用上面的标记判断即可,

不符合立即跳出。

就这样。

{
ID: codeway3
PROG: ariprog
LANG: PASCAL
}
program ariprog;
  var
    i,j,n,m,max,k,l,b:longint;
    a:array[0..200000]of integer;
  begin
    assign(input,'ariprog.in');
    reset(input);
    assign(output,'ariprog.out');
    rewrite(output);
    readln(n);
    n:=n-1;
    b:=0;
    readln(m);
    for i:=0 to m do
      for j:=0 to m do
        begin
          a[i*i+j*j]:=1;
          if i*i+j*j>max then max:=i*i+j*j;
        end;
    for i:=1 to max do
      for j:=0 to max-n*i do
        begin
          if (a[j]=1)and(a[j+n*i]=1) then
            begin
              l:=0;
              for k:=1 to n-1 do if a[j+k*i]=0 then
                begin
                  l:=1;
                  break;
                end;
              if l=0 then begin b:=1;writeln(j,' ',i);end;
            end;
        end;
    if b=0 then writeln('NONE');
    close(input);
    close(output);
  end.

posted on 2011-10-22 09:22  codeway3  阅读(352)  评论(0编辑  收藏  举报

导航