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 C# (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
 
class TEST{
	static void Main(){
		while(true){
			var n=long.Parse(Console.ReadLine());
			if(n==0)break;
			Sol mySol =new Sol(n);
			mySol.Solve();
		}
	}
}

class Sol{
	public void Solve(){
		if(N==1){
			Console.WriteLine("deficient number");
			return;
		}
		Dictionary<long,long> PD=PrimDec(N);
		
		long Sum=1;
		foreach(long i in PD.Keys){
			long d=1;
			for(int j=0;j<PD[i]+1;j++)d*=i;
			d-=1;
			d/=(i-1);
			Sum*=d;
			if(Sum>2*N)break;
		}
		Sum-=N;
		
		if(Sum==N)Console.WriteLine("perfect number");
		if(Sum<N)Console.WriteLine("deficient number");
		if(Sum>N)Console.WriteLine("abundant number");
		
		return;
	}

	long N;
	public Sol(long n){
		N=n;
	}


	Dictionary<long,long> PrimDec(long A){
		Dictionary<long,long> D=new Dictionary<long,long>();
		if(A==1)return null;
		long rem=A;
		for(long i=2;i<=(long)Math.Sqrt((double)A);i++){
			if(rem%i==0){
				long cnt=0;
				while(rem%i==0){cnt++;rem/=i;}
				D.Add(i,cnt);
			}
			if(rem==1)break;
	    	}
		if(rem!=1)D.Add(rem,1);
		return D;
	}


	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(){return Console.ReadLine().Split(' ');}
	static int[] ria(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>int.Parse(e));}
	static long[] rla(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>long.Parse(e));}
	static double[] rda(){return Array.ConvertAll(Console.ReadLine().Split(' '),e=>double.Parse(e));}
}