#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>

using lint = long long;

template <class T>
T gcd(T a, T b) {
    while (b > 0) {
        a %= b;
        std::swap(a, b);
    }
    return a;
}

bool solve(int N, std::vector<lint>& A) {
    lint sum = std::accumulate(A.begin(), A.end(), 0LL);

    // Nが偶数の場合、和の偶奇がそのまま勝敗になる
    if (N % 2 == 0) return sum % 2 != 0;

    // Nが奇数の場合も、和が偶数なら絶対勝てる
    if (sum % 2 == 0) return true;

    // 奇数を前に持っていく
    std::sort(A.begin(), A.end(), [](int a, int b) { return a % 2 > b % 2; });
    // 奇数が複数個ある、あるいは唯一の奇数が1(減らせない)なら負け
    if (A[0] == 1 || (A[1] & 1) != 0) return false;

    // そうでなければ、唯一の奇数を減らしてシミュレート
    --A[0];
    int g = accumulate(A.begin(), A.end(), 0LL, gcd<lint>);  // 全体のgcdを取る
    for (auto& a : A) a /= g;
    return !solve(N, A);
}

int main() {
    int N;
    std::cin >> N;
    std::vector<lint> A(N);
    for (auto& a : A) std::cin >> a;

    std::cout << (solve(N, A) ? "First" : "Second") << std::endl;
    return 0;
}

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long MAXN=100005;
long long n;
long long a[MAXN];
long long gcd(long long a,long long b)
{
	return b==0?a:gcd(b,a%b);
}
void pr(long long x)
{
	if(x==1)
		printf("First\n");
	else
		printf("Second\n");
	exit(0);
}
void dfs(long long x)
{
	long long s=0;
	for(long long i=1;i<=n;i++)
		s+=a[i]-1;
	if(s&1)
		pr(x^1);
	long long cnt=0;
	for(long long i=1;i<=n;i++)
		if(a[i]&1)
			cnt++;
	for(long long i=1;i<=n;i++)
		if(a[i]==1)
			cnt=903;
	if(cnt!=1)
		pr(x);
	for(long long i=1;i<=n;i++)
		if(a[i]&1)
		{
			a[i]--;
			break;
		}
	long long G=0;
	for(long long i=1;i<=n;i++)
		G=gcd(G,a[i]);
	for(long long i=1;i<=n;i++)
		a[i]/=G;
	dfs(x^1);
}
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	dfs(0);
}