#include <bits/stdc++.h>
using namespace std;
template <class T>
void print(const T &value) {
  std::cout << value << std::endl;
}
void yesno(bool a) {
  if (a)
    cout << "yes" << endl;
  else
    cout << "no" << endl;
}
void YesNo(bool a) {
  if (a)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
void YESNO(bool a) {
  if (a)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}
template <class T>
inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
long long INF = 1000001000;
long long mod = 1000000007;
long long power(long long x, long long n, long long mod) {
  long long res = 1;
  if (n > 0) {
    res = power(x, n / 2, mod);
    if (n % 2 == 0)
      res = (res * res) % mod;
    else
      res = (((res * res) % mod) * x) % mod;
  }
  return res;
}
int dx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};
int dy[8] = {0, -1, 1, 0, -1, 1, -1, 1};
struct Edge {
  int to, cost;
  Edge(int to, int cost) : to(to), cost(cost){};
};
using Graph = vector<vector<int>>;
using GraphW = vector<vector<Edge>>;
using P = pair<int, int>;
using lP = pair<long long, long long>;
using PP = pair<int, P>;
using p_queue = priority_queue<int, vector<int>, greater<int>>;
class UnionFindTree {
 public:
  UnionFindTree(int size) : memberSize(size) {
    par.resize(size * sizeof(long long));
    rnk.resize(size * sizeof(long long));
    diff_weight.resize(size * sizeof(long long));
    for (int i = 0; i < size; i++) {
      par[i] = i;
      rnk[i] = 0;
      diff_weight[i] = 0;
    }
  }
  int memberSize;
  vector<int> par;
  vector<int> rnk;
  vector<long long> diff_weight;
  void init(long long n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
      rnk[i] = 1;
    }
  }
  int find(long long x) {
    if (par[x] == x) {
      return x;
    } else {
      int r = find(par[x]);
      diff_weight[x] += diff_weight[par[x]];
      return par[x] = r;
    }
  }
  bool same(long long x, long long y) { return find(x) == find(y); }
  void unite(long long x, long long y) {
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }
    if (rnk[x] < rnk[y]) {
      par[x] = y;
    } else {
      par[y] = x;
      if (rnk[x] == rnk[y]) {
        rnk[x]++;
      }
    }
  }
  long long weight(long long x) {
    find(x);
    return diff_weight[x];
  }
  long long diff(long long x, long long y) { return weight(y) - weight(x); }
  void merge(int x, int y, int w) {
    w += weight(x);
    w -= weight(y);
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }
    if (rnk[x] < rnk[y]) {
      par[x] = y;
      diff_weight[x] = -w;
    } else {
      par[y] = x;
      diff_weight[y] = w;
      if (rnk[x] == rnk[y]) {
        rnk[x]++;
      }
    }
  }
};
priority_queue<P, vector<P>, greater<P>> que;
long long gcd(long long a, long long b) {
  if (a < b) {
    long long tmp = a;
    a = b;
    b = tmp;
  }
  long long r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
}
int main() {
  int N;
  cin >> N;
  int num_4 = 0, num_2 = 0;
  for (int i = 0; i < N; i++) {
    int a;
    cin >> a;
    if (a % 4 == 0) {
      num_4++;
    } else if (a % 2 == 0) {
      num_2++;
    }
  }
  YesNo((N - num_2) / 2 <= num_4);
}
