func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:16777216 )   using namespace std;   const double eps = 1e-9;   const double pi = acos(-1.0);   const int maxn = (int)1e4 + 10;   long long a[maxn], v[maxn], b[maxn];   long long gcd(long long A, long long B) {     A = abs(A);     B = abs(B);     while (B != 0) {       A %= B;       swap(A, B);     }     return A;   }   bool gcdEx(long long A, long long &X, long long B, long long &Y, long long C) {     long long lastX = 0;     long long lastY = 1;     X = 1;     Y = 0;     while (B != 0) {       long long sub = A / B;       X -= lastX * sub;       Y -= lastY * sub;       A -= B * sub;       swap(A, B);       swap(X, lastX);       swap(Y, lastY);     }     if (C % A != 0) return false;     X *= C / A;     Y *= C / A;     return true;   }   int main() {     long long n, m;     int k;     cin >> n >> m >> k;     long long lcm = 1;     for (int i = 0; i < k; i++) {       cin >> a[i];       b[i] = a[i];       long long g = gcd(lcm, a[i]);       if (a[i] / g > n / lcm) {         puts( NO );         return 0;       }       lcm = a[i] / g * lcm;     }     for (int i = 0; i < k; i++) {       v[i] = (-i % a[i] + a[i]) % a[i];     }     for (int i = 0; i < k - 1; i++) {       long long A = a[i];       long long B = -a[i + 1];       long long C = v[i + 1] - v[i];       long long G = gcd(A, B);       long long x, y;       if (!gcdEx(A, x, B, y, C)) {         puts( NO );         return 0;       }       assert(A * x + B * y == C);       long long X = (long long)1e18;       if (x < 0) {         long long add = (-x - B / G - 1) / (-B / G);         x += add * (-B / G);         y -= add * (-A / G);       }       long long sub = x / (-B / G);       x -= sub * (-B / G);       y += sub * (-A / G);       assert(x >= 0);       assert(B < 0 && -B == a[i + 1]);       assert(A * x + B * y == C);       assert(A * x >= 0);       assert(C < a[i + 1]);       if (y >= 0) {         X = min(X, a[i] * x + v[i]);       }       if (y < 0) {         long long add = (-y + A / G - 1) / (A / G);         y += add * (A / G);         x -= add * (B / G);       }       if (y >= 0) {         long long sub = y / (A / G);         y -= sub * (A / G);         x += sub * (B / G);       }       if (x >= 0) {         X = min(X, a[i + 1] * y + v[i + 1]);       }       if (X == (long long)1e18) {         puts( NO );         return 0;       }       if (X > m - k + 1) {         puts( NO );         return 0;       }       assert(X % a[i + 1] == v[i + 1]);       a[i + 1] = a[i] / gcd(a[i], a[i + 1]) * a[i + 1];       v[i + 1] = X;     }     long long X = v[k - 1];     if (X == 0) X = a[k - 1];     if (X > m - k + 1) {       puts( NO );       return 0;     }     for (int i = 0; i < k; i++) {       if (gcd(lcm, X + i) != b[i]) {         puts( NO );         return 0;       }     }     puts( YES );     return 0;   }   