#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 <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 6.66;
int arr [ MAXN ];
string player[2] = { "First","Second" };

int main ( ) {
  int n; scanf ( "%d",&n ) ;
  for ( int i = 0;i<n;i++ ) scanf ( "%d", arr + i ) ;
  int cnt[2] = { 0 , 0 };
  bool is_one = false;
  for ( int i = 0;i<n;i++ ) cnt[arr[i] % 2 ] ++,is_one |= (arr[i] == 1);
  if ( cnt[0] % 2 == 1 ) { printf ( "First\n" ); return 0; }
  bool turn = 0;
  while ( !is_one && cnt[1] == 1 )
  {
    for ( int i = 0;i<n;i++ ) if ( arr[i] % 2 ) arr[i] -- ;
    int gc = arr[0];
    for ( int i = 0;i<n;i++ ) gc = __gcd ( arr[i], gc );
    for ( int i = 0;i<n;i++ ) arr[i] /= gc;
    cnt[1] = cnt[0] = 0;
    for ( int i = 0;i<n;i++ ) cnt[arr[i] % 2 ] ++,is_one |= (arr[i] == 1);
    turn = !turn ;
  }
  if ( cnt[0] % 2 ) printf ( "%s\n", player[turn].c_str ( ) );
  else printf ( "%s\n", player[!turn].c_str ( ) );
  return 0;
}
