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.