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.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章