#include #include using namespace atcoder; #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using mint = modint1000000007; // linear sieve vector isp; vector ps, pf, mu; void sieve(int mx) { isp.resize(mx+1); pf.resize(mx+1); mu.resize(mx+1); mu[1] = 1; rep(i, mx+1) pf[i] = i; for (int i = 2; i <= mx; ++i) { if (pf[i] == i) isp[i] = true, ps.push_back(i), mu[i] = -1; rep(j, ps.size()) { int x = ps[j]*i; if (x > mx) break; pf[x] = ps[j]; if (i%ps[j] == 0) { mu[i*ps[j]] = 0; break; } mu[i*ps[j]] = -mu[i]; } } } int main() { int n, m; cin >> n >> m; if (n < m) { puts("0"); return 0; } int k = n/m; sieve(k); mint ans; for (int p = 1; p <= k; ++p) { ans += mint(mu[p])*(k/p)*(k/p); } ans -= 1; for (int i = 1; i <= n-2; ++i) { ans *= i; } cout << ans.val() << '\n'; return 0; }