Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cstdio>
- #include <algorithm>
- #include <map>
- using namespace std;
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define INF (1<<30)
- #define ll long long
- const int MOD = (1e9) + 7;
- const int M = 1e6;
- vector <ll> a, maxs;
- vector <int> use;
- ll fact[1000005], n;
- int k;
- ll bin(ll x, int y)
- {
- ll f = 1;
- while (y)
- if (y % 2 == 0)
- {
- x = x * x % MOD;
- y /= 2;
- } else
- {
- y--;
- f = f * x % MOD;
- }
- return f;
- }
- ll C(int k, int n)
- {
- return fact[n] * bin(fact[k], MOD - 2) % MOD * bin(fact[n - k], MOD - 2) % MOD;
- }
- void precalc()
- {
- fact[0] = 1;
- for (int i = 1; i <= M; i++) fact[i] = fact[i - 1] * i % MOD;
- }
- int main()
- {
- //freopen("lcm.in", "r", stdin);
- //freopen("lcm.out", "w", stdout);
- cin >> n >> k;
- precalc();
- ll d = 1;
- while (d * d < n)
- {
- if (n % d == 0)
- {
- a.pb(d);
- a.pb(n / d);
- }
- d++;
- }
- if (d * d == n) a.pb(d);
- use.resize(a.size() + 2);
- d = 2;
- int p = 0;
- ll last = -1;
- while (d * d <= n)
- if (n % d == 0)
- {
- if (d != last)
- {
- p++;
- maxs.pb(d);
- last = d;
- } else maxs[maxs.size() - 1] = maxs.back() * d;
- n /= d;
- } else d++;
- if (n != last)
- {
- maxs.pb(n);
- p++;
- } else maxs[maxs.size() - 1] = maxs.back() * n;
- ll dec = 0;
- for (int ms = 1; ms < (1<<p); ms++)
- {
- int delit = 0, how = 0;
- for (int j = 0; j < p; j++)
- if ((ms>>j)&1)
- {
- how++;
- for (int k = 0; k < a.size(); k++)
- if (a[k] % maxs[j] == 0) use[k] = ms;
- }
- for (int k = 0; k < a.size(); k++)
- if (use[k] == ms) delit++;
- ll e = C(k, k + a.size() - delit - 1);
- if (how&1) dec = (dec + e) % MOD;
- else
- {
- dec = (dec - e) % MOD;
- if (dec < 0) dec += MOD;
- }
- }
- ll ans = (C(k, k + a.size() - 1) - dec) % MOD;
- if (ans < 0) ans += MOD;
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement