Problem:
金利計算

金利は銀行に預けているお金に付き、その計算方法や利率は銀行によって様々です。利息と元金を合わせたものを元利と呼びますが、元利の計算方法として、利息を元金に組み入れずに計算する「単利」と利息を元金に組み入れて計算する「複利」というものがあり、より多くの元利を得るためにはこの差異を理解していなければなりません。元利の計算方法は以下のようになります。

銀行の数、お金を預ける年数、各銀行の情報（銀行番号、金利の種類、年利率（パーセント））を入力とし、最も元利が高くなる銀行番号を出力するプログラムを作成してください。ただし、最も元利が高くなる銀行は一つだけです。

入力

複数のデータセットが与えられます。入力の終わりはゼロひとつで示されます。各データセットは以下の形式で与えられます。

n
y
b1 r1 t1
b2 r2 t2
:
bn rn tn

1行目に銀行の数 n (1 ≤ n ≤ 50)、2行目にお金を預ける年数 y (1 ≤ y ≤ 30)が与えられます。続くn 行に i 番目の銀行の銀行番号 bi、年利率を表す整数 ri (1 ≤ ri ≤ 100)、 金利の種類 ti (1 または 2) が与えられます。金利の種類 ti は、単利の場合は1、複利の場合は2で与えられます。

データセットの数は 100 を超えません。

出力

データセットごとに、最も元利が高くなる銀行番号を１行に出力します。

入力例

2
8
1 5 2
2 6 1
2
9
1 5 2
2 6 1
0

出力例

2
1

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main{
    public static void main(String[] args){
	new Main().run();
    }
    Scanner sc = new Scanner(System.in);

    int n, y, b;
    int ansB;
    double max;

    void run(){
	while(sc.hasNext()){
	    n = sc.nextInt();
	    if(n==0) break;
	    y = sc.nextInt();
	    ansB = -1; max = 0;

	    for(int i=0; i<n; i++){
		b = sc.nextInt();
		double money = getMoney(sc.nextDouble(), sc.nextInt());
		if(money > max){
		    max = money;
		    ansB = b;
		}
		//System.out.println(money);
	    }

	    System.out.println(ansB);
	}
    }

    double getMoney(double r, int t){
	if(t==1)
	    return 1+y*r/100;
	else
	    return getP(1+r/100, y);
    }

    double getP(double a, int x){
	if(x==1)
	    return a;
	double z = getP(a, x/2);
	if(x%2==0)	    
	    return z*z;
	else 
	    return z*z*getP(a, 1);
    }
}