1251. 【USACO题库】1.4.3 Arithmetic Progressions等差数列

题目描述

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

在这个问题中a是一个非负的整数,b是正整数。

写一个程序来找出在双平方数集合S中长度为n的等差数列。

双平方数集合是所有能表示成p2q2的数的集合。


PROGRAM NAME: ariprog


INPUT FORMAT














第一行: N(3<= N<=25),要找的等差数列的长度。
第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。


SAMPLE INPUT (file ariprog.in) 

5

7


OUTPUT FORMAT

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

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

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

将不会有只多于10,000个等差数列。


SAMPLE OUTPUT (file ariprog.out)

1 4

37 4

2 8

29 8

1 12

5 12

13 12

17 12

5 20

2 24

输入

输出

样例输入

 
            

样例输出

 
            

数据范围限制

Fortuna OJ 项目
作者:  moreDRD; 协力:  twilight
由 Codeigniter / Bootstrap 驱动
Glyphicons 提供图标


又是一道淼题!淼淼淼!

枚举公差,首项

再对公差和首项进行判断。

枚举小技巧:

1,先枚举公差,避免O(n log n)排序;

2,公差只需枚举至m*m*2 div (n-1);

3,可提前对面末位进行判断(水法卡)

时间复杂度最高三亿九千万,但能过.....

187221 1251 2017王誉达 评测通过 100 757 ms 7.79 MB Pascal 1682 bytes 2017-08-09 14:50:23
呵呵,水法!

标程(请勿抄袭):

var
        i,j,k,m,n,o,p,l,s,t:longint;
        bz:array[0..1000000] of longint;
        a:array[0..1000000] of longint;
procedure qsort(l,r:longint);
var
        i,j,mid:longint;
begin
        i:=l;j:=r;mid:=a[(l+r) div 2];
        repeat
                while a[i]<mid do inc(i);
                while a[j]>mid do dec(j);
                if i<=j then begin
                        k:=a[i];
                        a[i]:=a[j];
                        a[j]:=k;
                        inc(i);dec(j);
                end;
        until i>j;
        if l<j then qsort(l,j);
        if i<r then qsort(i,r);
end;
begin
        readln(n);
        readln(m);
        for i:=0 to m do
                for j:=0 to m do
                begin
                        if bz[i*i+j*j]=0 then begin
                                inc(a[0]);
                                a[a[0]]:=i*i+j*j;
                                bz[i*i+j*j]:=1;
                        end;
                end;
        qsort(1,a[0]);
        s:=0;
        for i:=1 to m*m*2 div (n-1) do
                for j:=1 to a[0] do begin
                        t:=0;
                        if bz[a[j]+i*(n-1)]=0 then continue;
                        for k:=1 to n-1 do begin
                                if bz[a[j]+i*k]=0 then begin
                                        t:=1;
                                        break;
                                end;
                        end;
                        if t=0 then begin
                                writeln(a[j],' ',i);
                                s:=1;
                        end;
                end;
        if s=0 then writeln('NONE');
end.




猜你喜欢

转载自blog.csdn.net/wangyuda123456789/article/details/76991768
今日推荐