Problem:
平方採中法

古典的な乱数生成方法の一つである平方採中法のプログラムを作成します。平方採中法は、フォンノイマンによって 1940 年代半ばに提案された方法です。

平方採中法は、生成する乱数の桁数を n としたとき、初期値 s の2乗を計算し、その数値を 2n 桁の数値とみて、（下の例のように 2 乗した桁数が足りないときは、0 を補います。）その中央にある n 個の数字を最初の乱数とします。次にこの乱数を 2 乗して、同じ様に、中央にある n 個の数字をとって、次の乱数とします。例えば、123 を初期値とすると

1232 = 00015129 → 0151
1512 = 00022801 → 0228
2282 = 00051984 → 0519
5192 = 00269361 → 2693
26932 = 07252249 → 2522

の様になります。この方法を用いて、初期値 s（10000未満の正の整数）を入力とし、n = 4 の場合の乱数を 10 個生成し出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。１行目にデータセットの数 d (d ≤ 10) が与えられます。各データセットとして、１行に初期値 s（整数、1 ≤ s < 10000）が与えられます。

Output

各データセットに対して、

Case x: (x は 1 から始まるデータセット番号)
１個目の生成した乱数（整数）
２個目の生成した乱数（整数）
：
：
１０個目の生成した乱数（整数）

を出力してください。

Sample Input

2
123
567

Output for the Sample Input

Case 1:
151
228
519
2693
2522
3604
9888
7725
6756
6435
Case 2:
3214
3297
8702
7248
5335
4622
3628
1623
6341
2082

Solution in JAVA (judge verdict: Accepted)


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


// 2011/10/23

// 0137 
public class Main {

	static int dataSet = 1;
	
	// C return falseÅ¨µÜ¢
	boolean main() throws IOException {

		int a = readIntArray()[0];
		
		System.out.printf("Case %d:\n", dataSet++);
		for(int i = 0; i < 10; i++) {
			a = a * a;
			int r = a / 100;
			r = r % 10000;
			System.out.printf("%d\n", r);
			a = r;
		}
		
		
//		System.out.printf("%d\n", sum / size);
		
		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:15:";

			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 = Integer.MAX_VALUE;
		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ªÌæØè¶æØèÅÌ®lðÇÞ
	// EOFÌêÍnullðÔ·
	private static int[] readIntArray() throws IOException {

		String s = null;
		for(;;) {
			s = reader.readLine();
//			log.printf("%s\n", s);
			if (s == null)
				return null;
			s = s.trim();
			if (s.length() != 0) // ¦¦¦@Ç¤àËRósðÇÞ±Æª éBÇÝòÎ·Æ¤Ü­¢­çµ¢BBBB
				break;
		}
		
		String[] sp = s.split("[ ,]"); // æØè¶ÍXy[X©J}
		int[] a = new int[sp.length];
		for(int i = 0; i < sp.length; i++) {
			a[i] = Integer.parseInt(sp[i]);
		}
		return a;
	}
		
}