提交时间:2026-01-17 13:43:11

运行 ID: 39613

#include <algorithm> #include <iostream> #include <unordered_map> #include <vector> using namespace std; using i64 = long long; i64 ans; int n, m, k; vector<i64> a; unordered_map<i64, vector<int>> left_ans; void solve_left(int pos, i64 sum = 0, int mana = 0) { if (pos == n >> 1) { left_ans[sum].push_back(mana); return; } solve_left(pos + 1, sum, mana); solve_left(pos + 1, sum + a[pos], mana); solve_left(pos + 1, sum + a[pos] * a[pos] + 1, mana + 20); } void solve_right(int pos, i64 sum = 0, int mana = 0) { if (pos == n) { if (left_ans.count(k - sum) > 0) { const auto& cur = left_ans[k - sum]; ans += upper_bound(cur.begin(), cur.end(), m - mana) - cur.begin(); } return; } solve_right(pos + 1, sum, mana); solve_right(pos + 1, sum + a[pos], mana); solve_right(pos + 1, sum + a[pos] * a[pos] + 1, mana + 20); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m >> k; a.resize(n); for (auto& x : a) cin >> x; if (n == 1) { cout << (k == 0) + (k == a[0]) + (k == a[0] * a[0] + 1) << endl; return 0; } solve_left(0); for (auto& each : left_ans) sort(each.second.begin(), each.second.end()); solve_right(n >> 1); cout << ans << endl; return 0; }