stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;



#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define debug(a) cerr << #a << ": " << a << endl

#define endl '\n'

#define int long long



const int N = 1e5+5;



int  n, k;

int a[N];

int cache[N];



int dp(int curr)

{

      int &res = cache[curr];

      if(res != -1) return res;



      res =0;

      for(int i=1; i<=n; i++)

      {

            int rem = curr - a[i];

            if(rem<0) break;

            res |= (dp(rem)==0);

      }

      return res;

}





int32_t main()

{

      IOS;



      cin>>n>>k;

      for(int i=1; i<=n; i++) cin>>a[i];



      memset(cache, -1, sizeof cache);



      if(dp(k)) cout<<"First"<<endl;

      else cout<<"Second"<<endl;



      return 0;

}






// Faster C++ solution for the same problem (measured speedup: 1.7885252985346263x):
#include<bits/stdc++.h>

using namespace std;

void Fast() {

	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

}

int main() {

	Fast();

	int n, i, k;

	cin >> n >> k;

	int* v = new int[n];

	bool** dp = new bool* [k+1];

	for (i = 0; i <= k; i++)dp[i] = new bool[2];

	for (i = 0; i < n; i++)cin >> v[i];

	for (i = 0; i <= k; i++) {

		dp[i][0] = 1, dp[i][1] = 0;

		for (int j = 0; j < n; j++) {

			if (i - v[j] >= 0)dp[i][1] |= dp[i - v[j]][0];

			if (i - v[j] >= 0)dp[i][0] &= dp[i - v[j]][1];

		}

	}

	cout << (dp[k][1] ? "First" : "Second");

	delete[]v;

	for (i = 0; i <= k; i++)delete[]dp[i];

	delete[]dp;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



typedef long long int ll;





int dp[100010];

int arr[100010];

int n;



int go(int val){

    if(val == 0)    return 0;

    if(dp[val] != -1)   return dp[val];

    int pos = 0;

    for(int i = 0; i < n; i++){

        if(val >= arr[i]){

            int tval = go(val-arr[i]);

            if(tval == 0){

                pos = 1;

            }

        }

    }

    return dp[val] = pos;

}

int main(){

    memset(dp,-1,sizeof dp);

    int k;

    scanf("%d %d",&n,&k);

    for(int i = 0; i < n; i++){

        scanf("%d",arr+i);

    }

    int ans = go(k);

    if(ans == 0){

        printf("Second\n");

    }

    else{

        printf("First\n");

    }

    //printf("%.10f\n",ans);

}


// Faster C++ solution for the same problem (measured speedup: 1.3337166553691864x):
#include <iostream>

using namespace std;

const int MAXN=1e6+7;

int n,k,a[MAXN],f[MAXN][2];

int DFS(int s,int t)

{

	//cout<<"@@@ "<<s<<" "<<t<<endl;

	if(f[s][t]) return f[s][t];

	int ans=0;

	for(int i=1;i<=n;i++)

		if(s>=a[i]) ans|=!DFS(s-a[i],!t);

	return f[s][t]=ans;

}

int main()

{

	cin>>n>>k;

	for(int i=1;i<=n;i++) cin>>a[i];

	if(DFS(k,0)==false) cout<<"Second"<<endl;

	else cout<<"First"<<endl;

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

int arr[200],dp[200000],n,k;



int stone(int a){

	if(a == 0) return 2;

	if(dp[a] != 0) return dp[a];

	else{

		for(int i = 1; i <= n; i++){

			if(arr[i] > a) break;

			if(stone(a - arr[i]) == 2){

				dp[a] = 1;

				break;

			}

		}

		if(dp[a] == 0) dp[a] = 2;

	}

	

	return dp[a];

}

int main (){

	memset(dp,0,sizeof dp);

	cin >> n >> k;

	for(int i = 1; i <= n; i++){

		cin >> arr[i]; 

	}

	sort(arr + 1, arr + n + 1);

	

	int ans = stone(k);

	

	if(ans == 1)cout << "First" << endl;

	else cout << "Second" << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.674565844575033x):
#include <iostream>

using namespace std;

const int MAXN=1e6+7;

int n,k,a[MAXN],f[MAXN][2];

int DFS(int s,int t)

{

	//cout<<"@@@ "<<s<<" "<<t<<endl;

	if(f[s][t]) return f[s][t];

	int ans=0;

	for(int i=1;i<=n;i++)

		if(s>=a[i]) ans|=!DFS(s-a[i],!t);

	return f[s][t]=ans;

}

int main()

{

	cin>>n>>k;

	for(int i=1;i<=n;i++) cin>>a[i];

	if(DFS(k,0)==false) cout<<"Second"<<endl;

	else cout<<"First"<<endl;

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

#include <ext/numeric>



using namespace std;

using namespace __gnu_cxx;



#define sz(v)           ((int)((v).size()))

#define clr(v, d)       memset(v, d, sizeof(v))

#define rep(i, v)       for(int i=0; i<sz(v); ++i)

#define lp(i, n)        for(int i=0; i<(int)(n); ++i)

#define lpi(i, j, n)    for(int i=(j); i<(int)(n); ++i)

#define lpd(i, j, n)    for(int i=(j); i>=(int)(n); --i)

//#define INF             1000000000

//#define INF             100000000000000



typedef long long ll;

typedef pair<int, int> ii;

typedef vector<ii> vii;

typedef vector<int> vi;



void init(){

	std::ios_base::sync_with_stdio(false);

	cin.tie(NULL);

	cout.tie(NULL);

}



const int N = 1e5+5;

const int M = 104;



int dp[N][2];



int arr[M];



int n, k;



bool solve(int cur_k, bool turn){

	if(cur_k < 0)

		return turn;

	int & cur = dp[cur_k][turn];

	if(cur != -1)

		return cur;

	lp(i, n)

		if(solve(cur_k - arr[i], !turn) == turn)

			return (cur = turn);

	return (cur = !turn);

}



int main()

{

	clr(dp, -1);

	cin >> n >> k;

	lp(i, n)

		cin >> arr[i];

	cout << (solve(k, 0)?"Second":"First");

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.7757890270168704x):
#include <iostream>

using namespace std;

const int MAXN=1e6+7;

int n,k,a[MAXN],f[MAXN][2];

int DFS(int s,int t)

{

	//cout<<"@@@ "<<s<<" "<<t<<endl;

	if(f[s][t]) return f[s][t];

	int ans=0;

	for(int i=1;i<=n;i++)

		if(s>=a[i]) ans|=!DFS(s-a[i],!t);

	return f[s][t]=ans;

}

int main()

{

	cin>>n>>k;

	for(int i=1;i<=n;i++) cin>>a[i];

	if(DFS(k,0)==false) cout<<"Second"<<endl;

	else cout<<"First"<<endl;

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef double dd;

#define all(v) v.begin(),v.end()

#define endl "\n"

#define clr(n, r) memset(n,r,sizeof(n));



void fast() {

    cin.tie(0);

    cin.sync_with_stdio(0);

}











int main() {

int n,k;cin>>n>>k;

int arr[n];

    for (int i = 0; i <n ; ++i) {

        cin>>arr[i];

    }

    int dp[100009];

    clr(dp,0);

    for (int j = 0; j <=k ; ++j) {

        for (int i = 0; i < n; ++i) {

            if (arr[i] <= j) {

                if (!dp[j - arr[i]]) {

                        dp[j] = 1;

                        break;

                    }

                }

            }

        }

    cout<<(dp[k]?"First":"Second");

}

// Faster C++ solution for the same problem (measured speedup: 1.2336433805861853x):
#include <iostream>

using namespace std;

const int MAXN=1e6+7;

int n,k,a[MAXN],f[MAXN][2];

int DFS(int s,int t)

{

	//cout<<"@@@ "<<s<<" "<<t<<endl;

	if(f[s][t]) return f[s][t];

	int ans=0;

	for(int i=1;i<=n;i++)

		if(s>=a[i]) ans|=!DFS(s-a[i],!t);

	return f[s][t]=ans;

}

int main()

{

	cin>>n>>k;

	for(int i=1;i<=n;i++) cin>>a[i];

	if(DFS(k,0)==false) cout<<"Second"<<endl;

	else cout<<"First"<<endl;

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;



#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define debug(a) cerr << #a << ": " << a << endl

#define endl '\n'

#define int long long



const int N = 1e5+5;



int  n, k;

int a[N];

int cache[N];



int dp(int curr)

{

      int &res = cache[curr];

      if(res != -1) return res;



      res =0;

      for(int i=1; i<=n; i++)

      {

            int rem = curr - a[i];

            if(rem<0) break;

            res |= (dp(rem)==0);

      }

      return res;

}





int32_t main()

{

      IOS;



      cin>>n>>k;

      for(int i=1; i<=n; i++) cin>>a[i];



      memset(cache, -1, sizeof cache);



      if(dp(k)) cout<<"First"<<endl;

      else cout<<"Second"<<endl;



      return 0;

}






// Faster C++ solution for the same problem (measured speedup: 1.679256201156556x):
#include <iostream>

using namespace std;

const int MAXN=1e6+7;

int n,k,a[MAXN],f[MAXN][2];

int DFS(int s,int t)

{

	//cout<<"@@@ "<<s<<" "<<t<<endl;

	if(f[s][t]) return f[s][t];

	int ans=0;

	for(int i=1;i<=n;i++)

		if(s>=a[i]) ans|=!DFS(s-a[i],!t);

	return f[s][t]=ans;

}

int main()

{

	cin>>n>>k;

	for(int i=1;i<=n;i++) cin>>a[i];

	if(DFS(k,0)==false) cout<<"Second"<<endl;

	else cout<<"First"<<endl;

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

int arr[200],dp[200000],n,k;



int stone(int a){

	if(a == 0) return 2;

	if(dp[a] != 0) return dp[a];

	else{

		for(int i = 1; i <= n; i++){

			if(arr[i] > a) break;

			if(stone(a - arr[i]) == 2){

				dp[a] = 1;

				break;

			}

		}

		if(dp[a] == 0) dp[a] = 2;

	}

	

	return dp[a];

}

int main (){

	memset(dp,0,sizeof dp);

	cin >> n >> k;

	for(int i = 1; i <= n; i++){

		cin >> arr[i]; 

	}

	sort(arr + 1, arr + n + 1);

	

	int ans = stone(k);

	

	if(ans == 1)cout << "First" << endl;

	else cout << "Second" << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.2655617172014577x):
#include <bits/stdc++.h>



#define Fast cin.tie(0), ios::sync_with_stdio(0)

#define All(x) x.begin(), x.end()

#define louisfghbvc int t; cin >> t; while(t--)

#define sz(x) (int)(x).size()

using namespace std;

typedef long long LL;

typedef pair<LL, LL> ii;

typedef vector<LL> vi;



template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep = ""; for(const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }



void dbg_out() { cerr << "\n"; }

template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }



const int K = 1e5+5;

int arr[105];

int dp[K];

int n, k;



int dfs(int remain){

    if(dp[remain] != -1) return dp[remain];

    bool res = 0;

    for(int i = 0; i < n; ++i){

        if(remain >= arr[i]) res |= (dfs(remain-arr[i]) == 0);

    }

    return dp[remain] = res;

}



void solve(){

    cin >> n >> k;

    for(int i = 0; i < n; ++i) cin >> arr[i];

    memset(dp, -1, sizeof dp);



    cout << (dfs(k)==1 ? "First": "Second") << "\n";

}



int main()

{

    Fast;

    //louisfghbvc{

        solve();

    //}

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

#include <ext/numeric>



using namespace std;

using namespace __gnu_cxx;



#define sz(v)           ((int)((v).size()))

#define clr(v, d)       memset(v, d, sizeof(v))

#define rep(i, v)       for(int i=0; i<sz(v); ++i)

#define lp(i, n)        for(int i=0; i<(int)(n); ++i)

#define lpi(i, j, n)    for(int i=(j); i<(int)(n); ++i)

#define lpd(i, j, n)    for(int i=(j); i>=(int)(n); --i)

//#define INF             1000000000

//#define INF             100000000000000



typedef long long ll;

typedef pair<int, int> ii;

typedef vector<ii> vii;

typedef vector<int> vi;



void init(){

	std::ios_base::sync_with_stdio(false);

	cin.tie(NULL);

	cout.tie(NULL);

}



const int N = 1e5+5;

const int M = 104;



int dp[N][2];



int arr[M];



int n, k;



bool solve(int cur_k, bool turn){

	if(cur_k < 0)

		return turn;

	int & cur = dp[cur_k][turn];

	if(cur != -1)

		return cur;

	lp(i, n)

		if(solve(cur_k - arr[i], !turn) == turn)

			return (cur = turn);

	return (cur = !turn);

}



int main()

{

	clr(dp, -1);

	cin >> n >> k;

	lp(i, n)

		cin >> arr[i];

	cout << (solve(k, 0)?"Second":"First");

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.2986319479920694x):
#include <bits/stdc++.h>



#define Fast cin.tie(0), ios::sync_with_stdio(0)

#define All(x) x.begin(), x.end()

#define louisfghbvc int t; cin >> t; while(t--)

#define sz(x) (int)(x).size()

using namespace std;

typedef long long LL;

typedef pair<LL, LL> ii;

typedef vector<LL> vi;



template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep = ""; for(const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }



void dbg_out() { cerr << "\n"; }

template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }



const int K = 1e5+5;

int arr[105];

int dp[K];

int n, k;



int dfs(int remain){

    if(dp[remain] != -1) return dp[remain];

    bool res = 0;

    for(int i = 0; i < n; ++i){

        if(remain >= arr[i]) res |= (dfs(remain-arr[i]) == 0);

    }

    return dp[remain] = res;

}



void solve(){

    cin >> n >> k;

    for(int i = 0; i < n; ++i) cin >> arr[i];

    memset(dp, -1, sizeof dp);



    cout << (dfs(k)==1 ? "First": "Second") << "\n";

}



int main()

{

    Fast;

    //louisfghbvc{

        solve();

    //}

    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;



#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define debug(a) cerr << #a << ": " << a << endl

#define endl '\n'

#define int long long



const int N = 1e5+5;



int  n, k;

int a[N];

int cache[N];



int dp(int curr)

{

      int &res = cache[curr];

      if(res != -1) return res;



      res =0;

      for(int i=1; i<=n; i++)

      {

            int rem = curr - a[i];

            if(rem<0) break;

            res |= (dp(rem)==0);

      }

      return res;

}





int32_t main()

{

      IOS;



      cin>>n>>k;

      for(int i=1; i<=n; i++) cin>>a[i];



      memset(cache, -1, sizeof cache);



      if(dp(k)) cout<<"First"<<endl;

      else cout<<"Second"<<endl;



      return 0;

}






// Faster C++ solution for the same problem (measured speedup: 1.2691064782204582x):
#include <bits/stdc++.h>



#define Fast cin.tie(0), ios::sync_with_stdio(0)

#define All(x) x.begin(), x.end()

#define louisfghbvc int t; cin >> t; while(t--)

#define sz(x) (int)(x).size()

using namespace std;

typedef long long LL;

typedef pair<LL, LL> ii;

typedef vector<LL> vi;



template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep = ""; for(const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }



void dbg_out() { cerr << "\n"; }

template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }



const int K = 1e5+5;

int arr[105];

int dp[K];

int n, k;



int dfs(int remain){

    if(dp[remain] != -1) return dp[remain];

    bool res = 0;

    for(int i = 0; i < n; ++i){

        if(remain >= arr[i]) res |= (dfs(remain-arr[i]) == 0);

    }

    return dp[remain] = res;

}



void solve(){

    cin >> n >> k;

    for(int i = 0; i < n; ++i) cin >> arr[i];

    memset(dp, -1, sizeof dp);



    cout << (dfs(k)==1 ? "First": "Second") << "\n";

}



int main()

{

    Fast;

    //louisfghbvc{

        solve();

    //}

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



typedef long long int ll;





int dp[100010];

int arr[100010];

int n;



int go(int val){

    if(val == 0)    return 0;

    if(dp[val] != -1)   return dp[val];

    int pos = 0;

    for(int i = 0; i < n; i++){

        if(val >= arr[i]){

            int tval = go(val-arr[i]);

            if(tval == 0){

                pos = 1;

            }

        }

    }

    return dp[val] = pos;

}

int main(){

    memset(dp,-1,sizeof dp);

    int k;

    scanf("%d %d",&n,&k);

    for(int i = 0; i < n; i++){

        scanf("%d",arr+i);

    }

    int ans = go(k);

    if(ans == 0){

        printf("Second\n");

    }

    else{

        printf("First\n");

    }

    //printf("%.10f\n",ans);

}


// Faster C++ solution for the same problem (measured speedup: 1.3869918891585833x):
#include <bits/stdc++.h>

using namespace std;

const int maxk = 1e5+5;

const int maxn = 100+5;

int A[maxn];

bool dp[maxk];

int main(int argc, char const *argv[])

{

	int n, k, x; scanf("%d%d", &n, &k);

	memset(dp, false, sizeof dp);

	for(int i = 0; i < n; i++){

		scanf("%d", &A[i]);

		dp[A[i]] = true;

	}



	for(int i = 1; i <= k; i++){

		if(!dp[i]){

			for(int j = 0; j < n; j++){

				if(i - A[j] >= 0 && !dp[i-A[j]]){

					dp[i] = true;

					break;

				}

			}

		}

	}



	if(dp[k]) printf("First\n");

	else printf("Second\n");

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

int arr[200],dp[200000],n,k;



int stone(int a){

	if(a == 0) return 2;

	if(dp[a] != 0) return dp[a];

	else{

		for(int i = 1; i <= n; i++){

			if(arr[i] > a) break;

			if(stone(a - arr[i]) == 2){

				dp[a] = 1;

				break;

			}

		}

		if(dp[a] == 0) dp[a] = 2;

	}

	

	return dp[a];

}

int main (){

	memset(dp,0,sizeof dp);

	cin >> n >> k;

	for(int i = 1; i <= n; i++){

		cin >> arr[i]; 

	}

	sort(arr + 1, arr + n + 1);

	

	int ans = stone(k);

	

	if(ans == 1)cout << "First" << endl;

	else cout << "Second" << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.7414562792909276x):
#include <bits/stdc++.h>

using namespace std;

const int maxk = 1e5+5;

const int maxn = 100+5;

int A[maxn];

bool dp[maxk];

int main(int argc, char const *argv[])

{

	int n, k, x; scanf("%d%d", &n, &k);

	memset(dp, false, sizeof dp);

	for(int i = 0; i < n; i++){

		scanf("%d", &A[i]);

		dp[A[i]] = true;

	}



	for(int i = 1; i <= k; i++){

		if(!dp[i]){

			for(int j = 0; j < n; j++){

				if(i - A[j] >= 0 && !dp[i-A[j]]){

					dp[i] = true;

					break;

				}

			}

		}

	}



	if(dp[k]) printf("First\n");

	else printf("Second\n");

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

#include <ext/numeric>



using namespace std;

using namespace __gnu_cxx;



#define sz(v)           ((int)((v).size()))

#define clr(v, d)       memset(v, d, sizeof(v))

#define rep(i, v)       for(int i=0; i<sz(v); ++i)

#define lp(i, n)        for(int i=0; i<(int)(n); ++i)

#define lpi(i, j, n)    for(int i=(j); i<(int)(n); ++i)

#define lpd(i, j, n)    for(int i=(j); i>=(int)(n); --i)

//#define INF             1000000000

//#define INF             100000000000000



typedef long long ll;

typedef pair<int, int> ii;

typedef vector<ii> vii;

typedef vector<int> vi;



void init(){

	std::ios_base::sync_with_stdio(false);

	cin.tie(NULL);

	cout.tie(NULL);

}



const int N = 1e5+5;

const int M = 104;



int dp[N][2];



int arr[M];



int n, k;



bool solve(int cur_k, bool turn){

	if(cur_k < 0)

		return turn;

	int & cur = dp[cur_k][turn];

	if(cur != -1)

		return cur;

	lp(i, n)

		if(solve(cur_k - arr[i], !turn) == turn)

			return (cur = turn);

	return (cur = !turn);

}



int main()

{

	clr(dp, -1);

	cin >> n >> k;

	lp(i, n)

		cin >> arr[i];

	cout << (solve(k, 0)?"Second":"First");

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.7226713322610567x):
#include <bits/stdc++.h>

using namespace std;

const int maxk = 1e5+5;

const int maxn = 100+5;

int A[maxn];

bool dp[maxk];

int main(int argc, char const *argv[])

{

	int n, k, x; scanf("%d%d", &n, &k);

	memset(dp, false, sizeof dp);

	for(int i = 0; i < n; i++){

		scanf("%d", &A[i]);

		dp[A[i]] = true;

	}



	for(int i = 1; i <= k; i++){

		if(!dp[i]){

			for(int j = 0; j < n; j++){

				if(i - A[j] >= 0 && !dp[i-A[j]]){

					dp[i] = true;

					break;

				}

			}

		}

	}



	if(dp[k]) printf("First\n");

	else printf("Second\n");

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef double dd;

#define all(v) v.begin(),v.end()

#define endl "\n"

#define clr(n, r) memset(n,r,sizeof(n));



void fast() {

    cin.tie(0);

    cin.sync_with_stdio(0);

}











int main() {

int n,k;cin>>n>>k;

int arr[n];

    for (int i = 0; i <n ; ++i) {

        cin>>arr[i];

    }

    int dp[100009];

    clr(dp,0);

    for (int j = 0; j <=k ; ++j) {

        for (int i = 0; i < n; ++i) {

            if (arr[i] <= j) {

                if (!dp[j - arr[i]]) {

                        dp[j] = 1;

                        break;

                    }

                }

            }

        }

    cout<<(dp[k]?"First":"Second");

}

// Faster C++ solution for the same problem (measured speedup: 1.2829211932676787x):
#include <bits/stdc++.h>

using namespace std;

const int maxk = 1e5+5;

const int maxn = 100+5;

int A[maxn];

bool dp[maxk];

int main(int argc, char const *argv[])

{

	int n, k, x; scanf("%d%d", &n, &k);

	memset(dp, false, sizeof dp);

	for(int i = 0; i < n; i++){

		scanf("%d", &A[i]);

		dp[A[i]] = true;

	}



	for(int i = 1; i <= k; i++){

		if(!dp[i]){

			for(int j = 0; j < n; j++){

				if(i - A[j] >= 0 && !dp[i-A[j]]){

					dp[i] = true;

					break;

				}

			}

		}

	}



	if(dp[k]) printf("First\n");

	else printf("Second\n");

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;



#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define debug(a) cerr << #a << ": " << a << endl

#define endl '\n'

#define int long long



const int N = 1e5+5;



int  n, k;

int a[N];

int cache[N];



int dp(int curr)

{

      int &res = cache[curr];

      if(res != -1) return res;



      res =0;

      for(int i=1; i<=n; i++)

      {

            int rem = curr - a[i];

            if(rem<0) break;

            res |= (dp(rem)==0);

      }

      return res;

}





int32_t main()

{

      IOS;



      cin>>n>>k;

      for(int i=1; i<=n; i++) cin>>a[i];



      memset(cache, -1, sizeof cache);



      if(dp(k)) cout<<"First"<<endl;

      else cout<<"Second"<<endl;



      return 0;

}






// Faster C++ solution for the same problem (measured speedup: 1.7463339918917598x):
#include <bits/stdc++.h>

using namespace std;

const int maxk = 1e5+5;

const int maxn = 100+5;

int A[maxn];

bool dp[maxk];

int main(int argc, char const *argv[])

{

	int n, k, x; scanf("%d%d", &n, &k);

	memset(dp, false, sizeof dp);

	for(int i = 0; i < n; i++){

		scanf("%d", &A[i]);

		dp[A[i]] = true;

	}



	for(int i = 1; i <= k; i++){

		if(!dp[i]){

			for(int j = 0; j < n; j++){

				if(i - A[j] >= 0 && !dp[i-A[j]]){

					dp[i] = true;

					break;

				}

			}

		}

	}



	if(dp[k]) printf("First\n");

	else printf("Second\n");

	return 0;

}