提交时间:2024-05-26 20:41:03

运行 ID: 29776

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3 + 9, Mod = 1e9 + 7; ll s, t, n, m; struct poly { int a[N], len; void clear(int l) { len = l; for (int i = 0; i <= l; i++) a[i] = 0; } void print() { cout << len << endl; for (int i = 0; i <= len; i++) cout << a[i] << ' '; cout << endl; } }; poly operator * (const poly &x, const poly &y) { poly res; res.clear(min((int)(m - n + 1), x.len + y.len)); for (int i = 0; i <= res.len; i++) { for (int j = max(0, i - y.len); j <= min(i, x.len); j++) { res.a[i] = (res.a[i] + 1ll * x.a[j] * y.a[i - j]) % Mod; } } return res; } poly fpow(poly a, ll b) { poly res; res.len = 0, res.a[0] = 1; while (b) { if (b & 1) res = res * a; a = a * a, b >>= 1; } return res; } int main() { scanf("%lld%lld%lld%lld", &s, &t, &n, &m); poly A, B; A.len = B.len = 1, A.a[0] = A.a[1] = B.a[0] = B.a[1] = 1; A = fpow(A, s - n * t), B = fpow(B, t), B.len--; for (int i = 0; i <= B.len; i++) B.a[i] = B.a[i + 1]; B = A * fpow(B, n); printf("%d\n", B.a[m - n]); return 0; }