Untitled

 avatar
unknown
c_cpp
9 months ago
2.4 kB
22
Indexable
#include <bits/stdc++.h>
using namespace std;
#define ll long long

template<int mod>
struct Mint {
  int x;
  Mint() : x(0) {}
  Mint(ll x_) : x(x_ % mod) { if (x < 0) x += mod; }
  Mint& operator += (Mint b) { if ((x += b.x) >= mod) x -= mod; return *this;}
  Mint& operator -= (Mint b) { if ((x -= b.x) < 0) x += mod; return *this;}
  Mint& operator *= (Mint b) { x = (ll)(x) * b.x % mod; return *this;}
  Mint pow(ll e) const {
		Mint r = 1;
		for (Mint b = *this; e; b *= b, e >>= 1) 
			if (e & 1) r *= b;
    return r;
  }
  Mint inv() { return pow(mod - 2); }
  Mint& operator /= (Mint b) { return *this *= b.inv(); }
  friend Mint operator +  (Mint a, Mint b) { return a += b;     }
  friend Mint operator -  (Mint a, Mint b) { return a -= b;     }
  friend Mint operator /  (Mint a, Mint b) { return a /= b;     }
  friend Mint operator *  (Mint a, Mint b) { return a *= b;     }
  friend bool operator == (Mint a, Mint b) { return a.x == b.x; }
  friend bool operator != (Mint a, Mint b) { return a.x != b.x; }
};

typedef Mint<1000000007> mint;
const int mod = 1000000007;

vector<ll> fact_divs(ll x) {
  vector<ll> divs;
  for (ll i = 1; i <= x / i; i++) if (x % i == 0) {
    divs.push_back(i);
    if ((x / i) != i) divs.push_back(x / i);
  } 
  return divs;
}

vector<ll> fact_primes(ll x) {
  vector<ll> primes;
  for (ll i = 2; i <= x / i; i++) if (x % i == 0) {
    primes.push_back(i);
    while (x % i == 0) x /= i;
  }
  if (x > 1) primes.push_back(x);
  return primes;
}

mint choose(ll n, int r) { // n is huge, r is small 
  // n!/(n - r)!
  mint ans(1);
  for (ll i = n - r + 1; i <= n; i++) ans *= mint(i);
  for (int i = 1; i <= r; i++) ans /= mint(i);
  return ans;
}

void solve() {
  ll n, a, b;
  cin >> n >> a >> b;

  auto divs = fact_divs(b);
  auto primes = fact_primes(b);
  
  mint ans(0);
  for (ll d : divs) if (d <= a) {
    ll o = b / d;
    ll x = d;
    mint res(1);
    for (ll p : primes) {
      int c = 0;
      while (x % p == 0) {
        x /= p;
        c += 1;
      }
      res *= choose(n - 1 + c, c);
      c = 0;
      while (o % p == 0) {
        o /= p;
        c += 1;
      }
      res *= choose(n - 1 + c, c);
    }
    ans += res;
  }

  cout << ans.x << "\n";
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int tt = 1, tc = 1;
  cin >> tt;
  while (tt--) {
    cout << "Case #" << tc++ << ": ";
    solve();
  }
}
Editor is loading...
Leave a Comment