103 lines
1.8 KiB
C++
103 lines
1.8 KiB
C++
#include <iostream>
|
|
#include <vector>
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#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;
|
|
}
|