#include #include #include #include #warning That's the baby, that's not my baby typedef long long ll; /** b[0] = a[1] = a[t + 1] = a[2 * t + 1] = ... b[1] = a[2] = a[t + 2] = a[2 * t + 2] = ... b[2] = a[3] = a[t + 3] = a[2 * t + 3] = ... b[0] * x + b[1] * x + ... + b[i] * x + b[i + 1] * (x - 1) + b[i + 2] * (x - 1) + ... b[t - 1] * (x - 1) = s x * (b[0] + b[1] + ... + b[i]) + (x - 1) * (b[i + 1] + b[i + 2] + ... + b[t - 1]) = s i = k % t, x = k / t + 1 x * a + b * (x - 1) = s **/ const int mod = 1e9 + 7; const int NMAX = 1e7; int fac[NMAX + 1], ifac[NMAX + 1]; int power(int a, int b) { int p = 1; while (b) { if (b & 1) { p = (ll) p * a % mod; } a = (ll) a * a % mod; b >>= 1; } return p; } int C(int n, int k) { if (n < k) { return 0; } return (ll) fac[n] * ifac[k] % mod * ifac[n - k] % mod; } int sb(int n, int k) { return C(k - 1, n - 1); } int main() { fac[0] = 1; for (int i = 1; i <= NMAX; i++) { fac[i] = (ll) fac[i - 1] * i % mod; } ifac[NMAX] = power(fac[NMAX], mod - 2); for (int i = NMAX - 1; i >= 0; i--) { ifac[i] = (ll) ifac[i + 1] * (i + 1) % mod; } for (int i = 0; i <= NMAX; i++) { assert((ll) fac[i] * ifac[i] % mod == 1); } int k, s, t; std::cin >> k >> s >> t; int i = k % t, x = k / t + 1; // x >= 2 if (i == 0) { if (s % (x - 1) != 0) { std::cout << 0; } else { std::cout << sb(t, s / (x - 1)); } return 0; } /// x * a + b * (x - 1) = s int answer = 0; for (int a = 0; a * x <= s; a++) { int b = s - a * x; if (b % (x - 1) != 0) { continue; } b /= x - 1; /// a = suma primelor i, b = suma ultimelor t - i answer += (ll) sb(i, a) * sb(t - i, b) % mod; if (answer >= mod) { answer -= mod; } } std::cout << answer; return 0; }