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,然后用上面的标记判断即可,

不符合立即跳出。

就这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
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   codeway3  阅读(354)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

< 2011年10月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示