#include <bits/stdc++.h>
using namespace std;
template <class T>
bool ckmax(T& x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <class T>
bool ckmin(T& x, T y) {
  return x > y ? x = y, 1 : 0;
}
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f ? x : -x;
}
const long long N = 200005;
long long n, a[N], b[N], now, tot;
bool isrt(long long x) {
  if (x > 1e13) return 0;
  long long l = max(1ll, (long long)(sqrt(x) - 3)), r = sqrt(x) + 3;
  for (long long i = l, iend = r; i <= iend; ++i)
    if (x % i == 0) return 1;
  return 0;
}
signed main() {
  n = read() / 2;
  for (long long i = 1, iend = n; i <= iend; ++i) a[i] = read();
  for (long long i = 1; i <= n; ++i) {
    bool flg = 0;
    long long res;
    for (long long j = sqrt(a[i]); j >= 1; --j) {
      if (a[i] % j) continue;
      long long X = a[i] / j, Y = j;
      if ((X - Y) % 2) continue;
      res = (X - Y) / 2, res *= res;
      if (res <= now) continue;
      flg = 1;
      break;
    }
    if (now >= res || !flg) return puts("No"), 0;
    b[++tot] = res - now, b[++tot] = a[i];
    now = a[i] + res;
  }
  now = 0;
  for (long long i = 1, iend = n << 1; i <= iend; ++i) {
    now += b[i];
    if (!isrt(now)) return puts("No"), 0;
  }
  puts("Yes");
  for (long long i = 1, iend = n << 1; i <= iend; ++i) printf("%lld ", b[i]);
  puts("");
  return 0;
}
