Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <vector>
- #define ll long long
- std::vector<ll> subsetSumsPartial(std::vector<ll>::iterator beg,
- std::vector<ll>::iterator end) {
- uint16_t n{static_cast<uint16_t>(end - beg)};
- std::vector<ll> sums((1 << n), 0);
- for (uint16_t i{1}; i < (1 << n); i++) {
- ll sum{0};
- uint16_t j{i}, pos{0};
- while (j) {
- if (j & 1) sum += *(beg + pos);
- pos++;
- j >>= 1;
- }
- sums[i] = sum;
- }
- return sums;
- }
- ll subsetSumsTotal(const std::vector<ll> &sum1, const std::vector<ll> &sum2,
- int a, int b) {
- ll ans{0};
- for (auto x : sum1) {
- auto lit = std::lower_bound(sum2.begin(), sum2.end(), a - x);
- auto hit = std::upper_bound(sum2.begin(), sum2.end(), b - x);
- ans += (hit - lit);
- }
- return ans;
- }
- int main() {
- uint16_t n{};
- int a{}, b{};
- std::cin >> n >> a >> b;
- std::vector<ll> v(n);
- for (uint16_t i{0}; i < n; i++) std::cin >> v[i];
- std::vector<ll> sum1{subsetSumsPartial(v.begin(), (v.begin() + n / 2))};
- std::vector<ll> sum2{subsetSumsPartial(v.begin() + n / 2, v.end())};
- std::sort(sum2.begin(), sum2.end());
- std::cout << subsetSumsTotal(sum1, sum2, a, b) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment