Files
contests/2023/rcpc/d2/editorial/i-ksumt-67.cpp
2024-04-22 16:45:09 +03:00

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;
}