Problem:
問題 4

　IOI 不動産ではマンションの賃貸を行なっている．
この会社が取り扱うマンションの部屋は 1LDK で，
下図のように面積が 2xy+x+y になっている．
ただし， x, y は正整数である．

　IOI 不動産のカタログにはマンションの面積が昇順に（狭いものから順番に）書かれているが，この中にいくつか間違い（ありえない面積のもの）が混じっていることがわかった．

　カタログ（入力ファイル）は N+1 行で，最初の行に部屋数が書かれていて，
続く N 行に，１行に１部屋ずつ面積が昇順に書かれている．
ただし，
部屋数は 100,000 以下，
面積は (2の31乗)-1 = 2,147,483,647 以下である．
５つの入力データのうち３つまでは，
部屋数 1000 以下，面積 30000 以下である．

　間違っている行数（ありえない部屋の数）を出力しなさい．

　出力ファイルにおいては，
出力の最後の行にも改行コードを入れること．

入出力例

入力例

10
4
7
9
10
12
13
16
17
19
20

出力例

2

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Ruby (judge verdict: Memory Limit Exceeded)

# -*- coding: utf-8 -*-
list = {}

def calc(x,y)
  return 2*x*y + x + y
end
# ?????????????????????x??¨y??????????????????
def survey_x_y(cur_x_y, list)
  cur_x_y.times do |index|
    if index == 0
      next
    end
    x = index
    y = cur_x_y - index
    if x > y
      break
    end
    # ??????????????????
    list[calc(x,y)] = true
  end
end
def survey(area, list,surveyed_x_y)
  loop do
    if calc(1,surveyed_x_y) > area
      break
    else
      surveyed_x_y += 1
      survey_x_y(surveyed_x_y, list)
    end
  end
  if list[area] == true
    return true
  else
    return false
  end
end

surveyed_x_y = 2
survey_x_y(surveyed_x_y,list)

line = gets
count = line.to_i
cur_x_y = 2
bad_num = 0
count.times do
  line = gets
  area = line.to_i
  if survey(area,list,surveyed_x_y) == false
    bad_num += 1
  end
end
puts bad_num