#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1000000007; // オイラー関数φ(x):x以下の自然数で、xと互いに素なものの個数 void EulerTotient(int n, vector& phi) { vector prime(n+1, true); phi.assign(n+1, 0); for(int i=1; i<=n; ++i) phi[i] = i; for(int i=2; i<=n; ++i){ if(!prime[i]) continue; for(int j=1; i*j<=n; ++j){ prime[i*j] = false; phi[i*j] -= phi[i*j] / i; } } } int main() { int n, m; cin >> n >> m; vector phi; EulerTotient(n/m, phi); long long ans = 0; for(int i=2; i<=n/m; ++i){ ans += phi[i] * 2; ans %= MOD; } for(int i=1; i<=n-2; ++i){ ans *= i; ans %= MOD; } cout << ans << endl; return 0; }