Consider a table G of size n × m such that G(i, j) = GCD(i, j) for all 1 ≤ i ≤ n, 1 ≤ j ≤ m. GCD(a, b) is the greatest common divisor of numbers a and b.
You have a sequence of positive integer numbers a 1, a 2, …, a k. We say that this sequence occurs in table G if it coincides with consecutive elements in some row, starting from some position. More formally, such numbers 1 ≤ i ≤ n and 1 ≤ j ≤ m - k + 1 should exist that G(i, j + l - 1) = a l for all 1 ≤ l ≤ k.
Determine if the sequence a occurs in table G.
Input
The first line contains three space-separated integers n, m and k (1 ≤ n, m ≤ 1012; 1 ≤ k ≤ 10000). The second line contains k space-separated integers a 1, a 2, …, a k (1 ≤ a i ≤ 1012).
Output
Print a single word “YES”, if the given sequence occurs in table G, otherwise print “NO”.
Examples
input
100 100 5
5 2 1 2 1
output
YES
input
100 8 5
5 2 1 2 1
output
NO
input
100 100 7
1 2 3 4 5 6 7
output
NO
Note
Sample 1. The tenth row of table G starts from sequence {1, 2, 1, 2, 5, 2, 1, 2, 1, 10}. As you can see, elements from fifth to ninth coincide with sequence a.
Sample 2. This time the width of table G equals 8. Sequence a doesn’t occur there.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <memory.h> using namespace std; long long a[424242]; long long gcd( long long a, long long b) { while (a > 0 && b > 0) if (a > b) a %= b; else b %= a; return a + b; } void update( long long &a, long long &b, long long c, long long d) { if (b < d) { long long tmp; tmp = a; a = c; c = tmp; tmp = b; b = d; d = tmp; } while (a % d != c) a += b; b *= d; } int main() { long long n, m; int k; cin >> n >> m >> k; for ( int i=0;i<k;i++) { a[i] = 0; char ch = getchar (); while (ch < '0' || ch > '9' ) ch = getchar (); while (ch >= '0' && ch <= '9' ) { a[i] = a[i] * 10 + ch - 48; ch = getchar (); } } long long lcm = 1; for ( int i=0;i<k;i++) { long long g = gcd(lcm, a[i]); lcm /= g; if (1.0 * lcm * a[i] > 1e15) { puts ( "NO" ); return 0; } lcm *= a[i]; } if (lcm > n) { puts ( "NO" ); return 0; } long long x = lcm; vector < pair < long long , int > > primes; for ( long long j = 2; j * j <= x; j++) if (x % j == 0) { int cnt = 0; while (x % j == 0) { x /= j; cnt++; } primes.push_back(make_pair(j, cnt)); } if (x > 1) primes.push_back(make_pair(x, 1)); int sz = primes.size(); vector < long long > power, rem; for ( int i=0;i<sz;i++) { power.push_back(1); int cnt = primes[i].second; for ( int j=0;j<cnt;j++) power[i] *= primes[i].first; for ( int j=0;j<k;j++) if (a[j] % power[i] == 0) { long long z = (-j) % power[i]; if (z < 0) z += power[i]; rem.push_back(z); break ; } } long long num = 0, den = 1; for ( int i=0;i<sz;i++) { update(num, den, rem[i], power[i]); } if (num == 0) num += den; if (num + k - 1 > m) puts ( "NO" ); else { for ( int i=0;i<k;i++) if (gcd(lcm, num + i) != a[i]) { puts ( "NO" ); return 0; } puts ( "YES" ); } return 0; } |