Problem:
Score : 100 points

Problem Statement

There is a set A = \{ a_1, a_2, \ldots, a_N \} consisting of N positive integers.
Taro and Jiro will play the following game against each other.

Initially, we have a pile consisting of K stones.
The two players perform the following operation alternately, starting from Taro:

Choose an element x in A, and remove exactly x stones from the pile.

A player loses when he becomes unable to play.
Assuming that both players play optimally, determine the winner.

Constraints

All values in input are integers.

1 \leq N \leq 100

1 \leq K \leq 10^5

1 \leq a_1 < a_2 < \cdots < a_N \leq K

Input

Input is given from Standard Input in the following format:

N K
a_1 a_2 \ldots a_N

Output

If Taro will win, print First; if Jiro will win, print Second.

Sample Input 1

2 4
2 3

Sample Output 1

First

If Taro removes three stones, Jiro cannot make a move.
Thus, Taro wins.

Sample Input 2

2 5
2 3

Sample Output 2

Second

Whatever Taro does in his operation, Jiro wins, as follows:

If Taro removes two stones, Jiro can remove three stones to make Taro unable to make a move.

If Taro removes three stones, Jiro can remove two stones to make Taro unable to make a move.

Sample Input 3

2 7
2 3

Sample Output 3

First

Taro should remove two stones. Then, whatever Jiro does in his operation, Taro wins, as follows:

If Jiro removes two stones, Taro can remove three stones to make Jiro unable to make a move.

If Jiro removes three stones, Taro can remove two stones to make Jiro unable to make a move.

Sample Input 4

3 20
1 2 3

Sample Output 4

Second

Sample Input 5

3 21
1 2 3

Sample Output 5

First

Sample Input 6

1 100000
1

Sample Output 6

Second

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		memo = new int[2][];
		for(int i=0;i<2;i++){
			memo[i] = new int[K + 1];
		}
		
		memo[0][0] = 1;
		memo[1][0] = 1;
		
		for(int i=0;i<K;i++){
			for(int j=0;j<2;j++){
				if((memo[j][i] >> 1) % 2 == 0){
					for(int k=0;k<N;k++){
						if(i + A[k] > K) continue;
						memo[j ^ 1][i + A[k]] |= 1 << 1;
					}
				} else {
					for(int k=0;k<N;k++){
						if(i + A[k] > K) continue;
						memo[j ^ 1][i + A[k]] |= 1 << 0;
					}
				}
			}
		}
		
		Console.WriteLine(memo[0][K] != 1 ? "First" : "Second");
		
	}
	
	int dfs(int me, int k){
Console.WriteLine("{0} {1}",me,k);
		if(memo[me][k] != -1) return memo[me][k];
		
		int[] wl = new int[2];
		for(int i=0;i<N;i++){
			if(k - A[i] < 0) continue;
			int ret = dfs(me ^ 1, k - A[i]);
			wl[ret]++;
		}
		
		if(wl[0] > 0){
			return memo[me][k] = 1;
		} else {
			return memo[me][k] = 0;
		}
		
	}
	
	int[][] memo;
	int[] A;
	int N,K;
	public Sol(){
		var d = ria();
		N = d[0]; K = d[1];
		A = ria();
	}

	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(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}