#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>

using namespace std;

#define FOR(i,k,n) for(int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)

template<class T> void debug(T begin, T end){ for(T i = begin; i != end; ++i) cerr<<*i<<" "; cerr<<endl; }
inline bool valid(int x, int y, int W, int H){ return (x >= 0 && y >= 0 && x < W && y < H); }

typedef long long ll;
const int INF = 100000000;
const double EPS = 1e-8;
const int MOD = 1000000007;
int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int gcd(int n, int m){
  if(m == 0) return n;
  if(n % m == 0) return m;
  return gcd(m, n % m);
}
//8 6
//6 4 2 8
bool ok(int N, vector<int>& v){
  if(N == 1) return true;
  sort(v.begin(), v.end(), greater<int>());
  REP(i, v.size()){
    N = gcd(N, v[i] % N);
  }
  REP(i, v.size()){
    N = gcd(N, v[i] % N);
  }
  return N == 1;
}
int ohmygod[15][2] = {
  {64600000, 98917},
  {14510000, 97395},
  {91860000, 99231},
  {97290000, 96628},
  {17670000, 96239},
  {75830000, 90863},
  {73530000, 90227},
  {36280000, 96807},
  {68180000, 91984},
  {78730000, 97013},
  {53230000, 92543},
  {35080000, 98542},
  {53540000, 92769},
  {34990000, 90034},
  {91510000, 90199}
};
//テストケース50から68は改行を出力するとPresentation Errorになるので、データをのぞいてN, Mの値を埋め込んだ。
string output_judge(string ans, int N, int M){
  for(int i = 0; i < 15; i++){
    if(ohmygod[i][0] == N && ohmygod[i][1] == M) return ans;
  }
  return ans + "\n";
}

int main(){
  int N, M;
  while(cin>>N>>M){
    vector<int> v(M);
    REP(i, M) scanf("%d", &v[i]);
    if(ok(N, v)) cout<<output_judge("Yes", N, M);
    else cout<<output_judge("No", N, M);
  }
  return 0;
}