1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e3 + 50; ll N, K, S, ans, a[maxn], v[maxn], p[maxn];
ll pd(ll x) { ll fact = 1; while (x) { if (fact * x > S) return -1; fact *= x--; } return fact; }
map<pair<int, ll>, int> f; void check1() { ll cnt = 0, sum = 0; for (int i = 1; i <= N / 2; ++i) { if (v[i] == 1) sum += a[i]; else if (v[i] == 2) { ll s = p[i]; if ((s == -1) || ((s + sum) > S)) return; ++cnt; sum += s; } } ++f[{cnt, sum}]; ++f[{-1, sum}]; }
void dfs1(int x, ll k) { if (x > N / 2) check1(); else { for (int i = 0; i <= 2; ++i) { if (i == 0 || i == 1) { v[x] = i; dfs1(x + 1, k); } else if (i == 2 && k) { v[x] = i; dfs1(x + 1, k - 1); } } } }
map<pair<int, ll>, ll> g; ll query(int x, ll s) { if (g.count({x, s})) return g[{x, s}]; return g[{x, s}] = f[{x, s}] + (x ? query(x - 1, s) : 0); }
void check2() { ll cnt = 0, sum = 0; for (int i = N / 2 + 1; i <= N; ++i) { if (v[i] == 1) sum += a[i]; else if (v[i] == 2) { ll s = p[i]; if ((s == -1) || ((sum + s) > S)) return; ++cnt; sum += s; } } if (f.count({-1, S - sum})) ans += query(K - cnt, S - sum); }
void dfs2(int x, ll k) { if (x > N) check2(); else { for (int i = 0; i <= 2; ++i) { if (i == 0 || i == 1) { v[x] = i; dfs2(x + 1, k); } else if (i == 2 && k) { v[x] = i; dfs2(x + 1, k - 1); } } } }
int main() { cin >> N >> K >> S; for (int i = 1; i <= N; ++i) cin >> a[i], p[i] = pd(a[i]); dfs1(1, K), dfs2(N / 2 + 1, K); cout << ans << endl; return 0; }
|