範例程式碼 uva10254

//uva10254
import java.math.BigInteger;
import java.util.Scanner;

public class p10254{
	
	public static void main(String[] args) {
		final int Max = 10001;
		Scanner scanner = new Scanner(System.in);
		BigInteger[] han = new BigInteger [Max];
		BigInteger[] two = new BigInteger [Max];
		int[] k = new int [Max];
		
		two[0] = BigInteger.valueOf(0);
		two[1] = BigInteger.valueOf(1);
		han[0] = BigInteger.valueOf(0);
		han[1] = BigInteger.valueOf(1);
		k[1] = 0;
		for(int i = 2; i < Max; i++) {
			two[i] = BigInteger.valueOf(2).multiply(two[i-1]).add(BigInteger.valueOf(1));
			han[i] = BigInteger.valueOf(0);
			k[i] = 0;
		}
		
		for(int n = 2; n < Max; n++) {
			int tk = k[n-1];
			han[n] = han[tk].multiply(BigInteger.valueOf(2)).add(two[n-tk]); 
			for( ; tk <= n; tk++) {
				BigInteger tmp = han[tk].multiply(BigInteger.valueOf(2)).add(two[n-tk]);
				
				if(tmp.max(han[n]).equals(han[n]))
					han[n] = tmp;
				else {
					k[n] = tk - 1;
					break;
				}
			}
		}
		
		while(scanner.hasNextInt()) {
			int n = scanner.nextInt();
			System.out.println(han[n].toString());
		}
	}
}