#include #include using namespace std; typedef long long LL; const int N = 1000010, MOD = 1000000007; int n, k, fac[N], inv_fac[N], primes[10], cnt, ans; int GCD(int x, int y) { return y ? GCD(y, x % y) : x; } int QMI(LL a, int kk) { int ret = 1 % MOD; while (kk) { if (kk & 1) ret = 1LL * ret * a % MOD; a = a * a % MOD; kk >>= 1; } return ret; } int C(int x, int y) { return 1LL * fac[x] * inv_fac[y] % MOD * inv_fac[x - y] % MOD; } int main() { scanf("%d%d", &n, &k); int g = GCD(n, k); for (int i = 2; i * i <= g; ++i) { if (g % i == 0) { primes[++cnt] = i; while (g % i == 0) g /= i; } } if (g > 1) primes[++cnt] = g; fac[0] = 1; for (int i = 1; i <= n; ++i) { fac[i] = 1LL * fac[i - 1] * i % MOD; } inv_fac[n] = QMI(fac[n], MOD - 2); for (int i = n; i >= 1; --i) { inv_fac[i - 1] = 1LL * inv_fac[i] * i % MOD; } for (int mask = 1; mask < (1 << cnt); ++mask) { int t = 1, sz = 0; for (int i = 1; i <= cnt; ++i) { if (mask >> (i - 1) & 1) { t *= primes[i]; ++sz; } } if (sz & 1) ans = (ans + C(n / t, k / t)) % MOD; else ans = (ans - C(n / t, k / t) + MOD) % MOD; } printf("%d\n", ans); return 0; }