2023 rcpc
This commit is contained in:
102
2023/rcpc/d2/editorial/i-ksumt-67.cpp
Normal file
102
2023/rcpc/d2/editorial/i-ksumt-67.cpp
Normal file
@@ -0,0 +1,102 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user