// Original C++ solution (slower):
#include<bits/stdc++.h>

#define ll long long

using namespace std;

vector<ll> vec;

bool turno = 0;

ll gcd(ll a, ll b){

	if(a%b==0) return b;

	return gcd(b,a%b);

}





ll gcdTodos(){

    ll act = gcd(vec[0], vec[1]);

    for(long i = 2; i < vec.size(); i++){

        act = gcd(act, vec[i]);

    }

    return act;

}



void solve(){

    //cout << turno <<'\n';

    bool todosUn = true;

    for(long i = 0; i <vec.size() ; i++){

        if(vec[i] != 1){

            todosUn = false;

            break;

        }

    }

    if(todosUn){

        if(turno){

                turno = 0;

            }else {

                turno = 1;

            }



        return;

    }

    /*for(long i = 0; i <vec.size() ; i++){

        cout << vec[i]<<" ";

    }*/

    //cout<<'\n';

    long numPar = 0;

    long numImpar = 0;

    for(long i = 0; i < vec.size(); i++){

        if(vec[i] % 2 == 0){

                numPar++;

        }else{

            numImpar++;

        }

    }

    if(numPar % 2 == 1){

        //cout << "Numero impar de pares\n";

        return ;



    }else if((numPar % 2 == 0) && (numImpar >= 2)){

        //cout<<"Par numero de pares y 2 o mas impares\n";

        if(turno){

            turno = 0;

        }else turno = 1;

        return;

    }else{

        bool cambio = false;

        //cout << "Simular\n";

        for(long i = 0; i < vec.size(); i++){

            if(vec[i] % 2 == 1 && (vec[i]!= 1)){

                cambio = true;

                vec[i]--;

                break;

            }

        }

        if(cambio){

            ll aux = gcdTodos();

            for(long i = 0; i < vec.size(); i++){

                if(vec[i] % aux == 0){

                    vec[i] /= aux;

                }

            }

            if(turno){

                turno = 0;

            }else {

                turno = 1;

            }

            solve();

        }else{

            for(long i = 0; i < vec.size(); i++){

                if(vec[i]!= 1){

                    vec[i]--;

                    break;

                }

            }

            ll aux = gcdTodos();

            for(long i = 0; i < vec.size(); i++){

                if(vec[i] % aux == 0){

                    vec[i] /= aux;

                }

            }

            if(turno){

                turno = 0;

            }else {

                turno = 1;

            }

            solve();

        }

    }

}

int main(){

    long n;

    cin >> n;

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

        ll aux; cin >> aux;

        vec.push_back(aux);

    }



    solve();

    if(!turno){

        cout << "First\n";

    }else{

        cout << "Second\n";

    }



}


// Optimized solution to the same problem (faster):
#include<cstdio>

#define sev en

using namespace std;

#define N 100010



int a[N],cnt[2],n;



int gcd(int a,int b){

	if(b == 0)

		return a;

	return gcd(b,a % b);

}



int dg(){

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

		if(a[i] & 1)

			a[i]--;

	cnt[0] = cnt[1] = 0;

	int w = a[1];

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

		w = gcd(w,a[i]);

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

		cnt[(a[i] /= w) & 1]++;

	if(cnt[0] & 1)

	return 1;

	else if(cnt[1] > 1)

	return 0;

	else{

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

		if(a[i] == 1)

		return cnt[0] & 1 ? 1 : 0;

		return dg() ^ 1;

	}

}



int main(){

	scanf("%d",&n);

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

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

		cnt[a[i] & 1]++;

	}

	if(cnt[0] & 1)

	printf("First");

	else if(cnt[1] > 1)

	printf("Second");

	else{

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

		if(a[i] == 1){

			printf(cnt[0] & 1 ? "First" : "Second");

			return 0;

		}

		if(dg() ^ 1)

		printf("First");

		else

		printf("Second");

	}

	return 0;

}

// Fastest known solution for this problem: