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 C (judge verdict: Wrong Answer)

// AOJ 0590
// @kankichi573
#include <stdio.h>
#include <string.h>

char prime_flag[65536];

int prime256[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,
67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,
157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,
241,251};

make_furui()
{
        int i,j,num;
        memset(prime_flag,-1,65536);
        
        prime_flag[0]=prime_flag[1]=0;

        for(i=0;prime256[i];i++)
                for(j=2;(num=prime256[i]*j)<65536;j++)
                {
                        //printf("%d\n",num);
                        prime_flag[num]=0;
                }
}
int isprime32(int n)
{
        int i;

        for(i=2;i<46340;i++)
                if(prime_flag[i] && 0==(n % i) && (n > i))
                        return(0);
        return(1);
}

main()
{
        int N,cnt,num,i;

        make_furui();

        scanf("%d",&N);

        for(i=0,cnt=0;i<N;i++)
        {
                scanf("%d",&num);
                cnt += isprime32(2*num+1);
        }
        printf("%d\n",cnt);
        return(0);
}