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: Accepted)


import java.io.*;
import java.util.*;


// 2011/10/21

//@2101@®S 
public class Main {

	// föªð·é
	//  zñÉfÆA×«ªðÝÉÀÔ
	//  0 ÆÍnullðÔ·
	//  1 ÌÆ«ÍózñðÔ·
	long[] soinsubunkai(long a) {
		if (a <= 0)
			return null;
		List<Long> list = new ArrayList<Long>();
		if (a % 2 == 0) {
			a /= 2;
			int beki = 1;
			while(a % 2 == 0) {
				a /= 2;
				beki++;
			}
			list.add(2L);
			list.add((long)beki);
		}
		for(long k = 3;; k += 2) {
			if (k * k > a)
				break;
			if (a % k == 0) {
				a /= k;
				int beki = 1;
				while(a % k == 0) {
					a /= k;
					beki++;
				}
				list.add(k);
				list.add((long)beki);
			}
		}
		if (a != 1) {
			list.add(a);
			list.add(1L);
		}
		
		long[] ret = new long[list.size()];
		for(int i = 0; i < list.size(); i++) {
			ret[i] = list.get(i);
		}
		return ret;
	}

	// C return falseÅ¨µÜ¢
	boolean main() throws IOException {

		int[] ir = readIntArray();
		
		int n = ir[0];
		if (n == 0)
			return false;
		
		long[] so = soinsubunkai(n);

		long mul = 1;
		for(int i = 0; i < so.length / 2; i++) {
			long a = so[i * 2];
			long b = so[i * 2 + 1];
			long sum = 1;
			long m = 1;
			for(int j = 0; j < b; j++) {
				m *= a;
				sum += m;
			}
			mul *= sum;
		}
		
		String s;
		if (mul > n * 2) {
			s = "abundant number";
		}
		else if (mul == n * 2) {
			s = "perfect number";
		}
		else  {
			s = "deficient number";
		}
		
		// ðÌ\¦
		System.out.printf("%s\n", s);
		
		return true; // ³íI¹ Ö
	}
	

//	private final static boolean DEBUG = true;  // debug
	private final static boolean DEBUG = false; // release

	public static void main(String[] args) throws IOException {

		if (DEBUG) {
			log = System.out;
			
//			String inputStr = "1,2 4,";
			String inputStr = "28,0,";

			inputStr = inputStr.replace(",", "\n");

			reader = new BufferedReader(new StringReader(inputStr)); 

		}
		else {
			log = new PrintStream(new OutputStream() { public void write(int b) {} } ); // «ÌÄ
			reader = new BufferedReader(new InputStreamReader(System.in)); // R\[©ç
		}
		
		//int N = readIntArray()[0];

		for(int i = 0; /*i < N*/; i++) {
			boolean b = new Main().main();
			if (!b)
				break;
		}		
		
		reader.close();
	}

	
	static PrintStream log;
	static BufferedReader reader;
	

	// WüÍæè1sªÌXy[XæØèÌ®lðÇÞ
	// EOFÌêÍnullðÔ·
	private static int[] readIntArray() throws IOException {
		
		String s = reader.readLine();
		if (s == null)
			return null;
		String[] sp = s.split(" ");
		int[] a = new int[sp.length];
		for(int i = 0; i < sp.length; i++) {
			a[i] = Integer.parseInt(sp[i]);
		}
		return a;
	}
		
}