Arithmetic Progressions等差数列

 Arithmetic Progressions等差数列
一个等差数列是一个能表示成 a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)
在这个问题中 a 是一个非负的整数,b 是正整数.
写一个程序来找出在双平方数集合 S 中长度为 n 的等差数列.
双平方数集合是所有能表示成 p2+q2 的数的集合.
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  17
13 12
17 12
5 20
2 24

================================

==========================

{
ID:jie19952
PROG:ariprog
LANG:PASCAL
}
type
  re=record
       a,d:longint;
     end;
var
  n,m:longint;
  exist:array[0..125000]of boolean;
  shu:array[0..125000]of longint;
  ans:array[1..10000]of re;
  ans_num:longint;
procedure init;
begin
  assign(input,'ariprog.in');
  assign(output,'ariprog.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,j:longint;
  a1,d1,n1,k1:longint;
  flag:boolean;
begin
  readln(n);
  readln(m);
  fillchar(exist,sizeof(exist),false);
  for i:=0 to m do
    for j:=i to m do
      exist[i*i+j*j]:=true;
  shu[0]:=0;
  for i:=0 to 2*m*m do
    if exist[i] then
      begin
        inc(shu[0]);
        shu[shu[0]]:=i;
      end;
  ans_num:=0;
  for j:=1 to shu[shu[0]] do   //枚举d
  for i:=1 to shu[0] do  //枚举a
      begin
        a1:=shu[i];
        d1:=j;
        if a1+d1*(n-1)>shu[shu[0]] then break;
        n1:=n-1;
        flag:=true;
        while n1>0 do
          begin
            a1:=a1+d1;
            if not exist[a1] then
              begin
                flag:=false;
                break;
              end;
            dec(n1);
          end;
        if flag then
          begin
            inc(ans_num);
            ans[ans_num].a:=a1-d1*(n-1);
            ans[ans_num].d:=j;
          end;
      end;
  for i:=1 to ans_num do
    begin
      writeln(ans[i].a,' ',ans[i].d);
    end;
  if ans_num=0 then writeln('NONE');
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值