#include #include #include #include #include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 30001; int n, m, l, s, t; std::vector> g[N * 101]; int dist[N * 101]; std::bitset vis; int spfa() { memset(dist, 0x3f, sizeof(dist)); std::queue q; dist[s] = 0; q.push(s); vis[s] = true; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for (auto t : g[u]) { int v = t.first; short w = t.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!vis[v]) { q.push(v); vis[v] = true; } } } } return dist[t] == 0x3f3f3f3f ? -1 : dist[t]; } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; l = std::min(static_cast(std::sqrt(n)), 100); for (int i = 1, b, p; i <= m; i++) { cin >> b >> p; b++; if (i == 1) s = b; if (i == 2) t = b; if (p <= l) { g[b].emplace_back(p * n + b, 0); } else { for (int j = 1; b + j * p <= n; j++) { g[b].emplace_back(b + j * p, j); } for (int j = 1; b - j * p > 0; j++) { g[b].emplace_back(b - j * p, j); } } } for (int i = 1; i <= l; i++) { for (int j = 1; j <= n; j++) { g[i * n + j].emplace_back(j, 0); } for (int j = 1; j <= n - i; j++) { g[i * n + j].emplace_back(i * n + j + i, 1); g[i * n + j + i].emplace_back(i * n + j, 1); } } cout << spfa() << endl; return 0; }