Problem:
Problem B: 完全数

ある整数 N に対し，その数自身を除く約数の和を S
とする．
N = S のとき
N は完全数 (perfect number)，
N > S のとき
N は不足数 (deficient number)，
N < S のとき
N は過剰数 (abundant number) と呼ばれる．
与えられた整数が，完全数・不足数・過剰数のどれであるかを
判定するプログラムを作成せよ．

プログラムの実行時間が制限時間を越えないように注意すること．

Input

入力はデータセットの並びからなる．
データセットの数は 100 以下である．

各データセットは整数 N
(0 < N ≤ 100000000) のみを含む1行からなる．

最後のデータセットの後に，入力の終わりを示す 0 と書かれた1行がある．

Output

各データセットに対し，
整数 N が完全数ならば “perfect number”，
不足数ならば “deficient number”，
過剰数ならば “abundant number” という文字列を
1行に出力せよ．

Sample Input

1
2
3
4
6
12
16
28
33550336
99999998
99999999
100000000
0

Output for the Sample Input

deficient number
deficient number
deficient number
deficient number
perfect number
abundant number
deficient number
perfect number
perfect number
deficient number
deficient number
abundant number

Solution in JAVA (judge verdict: Memory Limit Exceeded)

import java.util.Scanner;;

public class Main {
	static int yaku(int a) {
		boolean[] y = new boolean[a+1];
		for(int i=2;i<a;i++) {
			y[i] = false;
		}
		for(int i=2;i<=a/2;i++) {
			if(a%i==0) {
				y[i] = true;
				y[a/i] = true;
			}
		}
		int cnt = 1;
		for(int i=2;i<a;i++) {
			if(y[i]) { cnt += i;}
		}
		return cnt;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()) {
			int n = sc.nextInt();
			if(n==0)break;
			int a = yaku(n);
			if(n==1)
				System.out.println("deficient number");
			else if(a==n)
				System.out.println("perfect number");
			else if(a<n)
				System.out.println("deficient number");
			else if(a>n)
				System.out.println("abundant number");
		}
	
	}
}