#include using namespace std; const long mod = 1000000007; vector fact, invfact; void getprimes(vector &primes, int g) { if (g % 2 == 0) primes.push_back(2); while (g % 2 == 0) g /= 2; if (g % 3 == 0) primes.push_back(3); while (g % 3 == 0) g /= 3; int d = 2, div = 5; while (div * div <= g) { if (g % div == 0) primes.push_back(div); while (g % div == 0) g /= div; div += d; d = 6 - d; } if (g > 1) primes.push_back(g); } int gcd(int m, int n) { if (n == 0) return m; return gcd(n, m % n); } long combination(int n, int k) { return (fact.at(n) * invfact.at(k) % mod) * invfact.at(n - k) % mod; } long power(long n, long i) { if (i == 0) return 1; long next = power(n * n % mod, i / 2); if (i % 2 == 0) return next; return n * next % mod; } long inv(long n) { return power(n, mod - 2); } void init_fact(int n) { fact.push_back(1); invfact.push_back(1); for (int i = 1; i <= n; i++) { fact.push_back(fact.at(i - 1) * i % mod); invfact.push_back(inv(fact.at(i))); } } int main() { int n, k; cin >> n >> k; vector primes; getprimes(primes, gcd(n, k)); init_fact(n); long s = 0; for (int i = 1; i < 1 << primes.size(); i++) { int d = 1, count1s = 0; for (size_t j = 0; j < primes.size(); j++) { if ((i >> j) % 2 == 1) { d *= primes.at(j); count1s++; } } s += (2 * (count1s % 2) - 1) * combination(n / d, k / d); while (s < 0) s += mod; s %= mod; } cout << s << endl; }