Advertisement
Guest User

Untitled

a guest
Dec 10th, 2011
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <map>
  6. using namespace std;
  7. #define f first
  8. #define s second
  9. #define mp make_pair
  10. #define pb push_back
  11. #define INF (1<<30)
  12. #define ll long long
  13. const int MOD = (1e9) + 7;
  14. const int M = 1e6;
  15. vector <ll> a, maxs;
  16. vector <int> use;
  17. ll fact[1000005], n;
  18. int k;
  19. ll bin(ll x, int y)
  20. {
  21.   ll f = 1;
  22.   while (y)
  23.     if (y % 2 == 0)
  24.     {
  25.       x = x * x % MOD;
  26.       y /= 2;
  27.     } else
  28.     {
  29.       y--;
  30.       f = f * x % MOD;
  31.     }
  32.   return f;
  33. }
  34. ll C(int k, int n)
  35. {
  36.   return fact[n] * bin(fact[k], MOD - 2) % MOD * bin(fact[n - k], MOD - 2) % MOD;
  37. }
  38. void precalc()
  39. {
  40.   fact[0] = 1;
  41.   for (int i = 1; i <= M; i++) fact[i] = fact[i - 1] * i % MOD;
  42. }
  43. int main()
  44. {
  45.   //freopen("lcm.in", "r", stdin);
  46.   //freopen("lcm.out", "w", stdout);
  47.   cin >> n >> k;
  48.   precalc();
  49.   ll d = 1;
  50.   while (d * d < n)
  51.   {
  52.     if (n % d == 0)
  53.     {
  54.       a.pb(d);
  55.       a.pb(n / d);
  56.     }
  57.     d++;
  58.   }
  59.   if (d * d == n) a.pb(d);
  60.   use.resize(a.size() + 2);
  61.   d = 2;
  62.   int p = 0;
  63.   ll last = -1;
  64.   while (d * d <= n)
  65.     if (n % d == 0)
  66.     {
  67.       if (d != last)
  68.       {
  69.         p++;
  70.         maxs.pb(d);
  71.         last = d;
  72.       } else maxs[maxs.size() - 1] = maxs.back() * d;
  73.       n /= d;
  74.     } else d++;
  75.  
  76.   if (n != last)
  77.   {
  78.     maxs.pb(n);
  79.     p++;
  80.   } else maxs[maxs.size() - 1] = maxs.back() * n;
  81.   ll dec = 0;
  82.   for (int ms = 1; ms < (1<<p); ms++)
  83.   {
  84.     int delit = 0, how = 0;
  85.     for (int j = 0; j < p; j++)
  86.       if ((ms>>j)&1)
  87.       {
  88.         how++;
  89.         for (int k = 0; k < a.size(); k++)
  90.           if (a[k] % maxs[j] == 0) use[k] = ms;
  91.       }
  92.     for (int k = 0; k < a.size(); k++)
  93.       if (use[k] == ms) delit++;
  94.     ll e = C(k, k + a.size() - delit - 1);
  95.     if (how&1) dec = (dec + e) % MOD;
  96.     else
  97.     {
  98.       dec = (dec - e) % MOD;
  99.       if (dec < 0) dec += MOD;
  100.     }
  101.   }
  102.   ll ans = (C(k, k + a.size() - 1) - dec) % MOD;
  103.   if (ans < 0) ans += MOD;
  104.   cout << ans;
  105.   return 0;
  106. }
  107.  
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement