Cod sursa(job #2784105)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 15 octombrie 2021 19:26:03
Problema Oite Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("oite.in");
ofstream fout("oite.out");

const int MAXN = 1 << 10;
const int mod = 196613;
const int MASK = (1 << 27) - 1;
int a[1 + MAXN];
vector<pair<int, int>> hash_table[mod];
bitset<1 + MASK> filter;

void add(int x) {
  int key = x % mod;
  for (auto &it : hash_table[key]) {
    if (it.first == x) {
      ++it.second;
      return;
    }
  }
  hash_table[key].emplace_back(x, 1);
  filter[x & MASK] = true;
}

int find_freq(int x) {
  if (filter[x & MASK] == false) {
    return false;
  }
  int key = x % mod;
  for (auto it : hash_table[key]) {
    if (it.first == x) {
      return it.second;
    }
  }
  return 0;
}

void test_case() {
  int n, target;
  fin >> n >> target;
  for (int i = 1; i <= n; ++i) {
    fin >> a[i];
  }
  sort(a + 1, a + n + 1);
  int64_t ans = 0;
  for (int i = 1; i <= n - 1; ++i) {
    for (int j = i + 1; j <= n; ++j) {
      if (target - a[i] - a[j] < 0) {
        break;
      }
      ans += find_freq(target - a[i] - a[j]);
    }
    for (int j = 1; j <= i - 1; ++j) {
      add(a[j] + a[i]);
    }
  }
  fout << ans << '\n';
}

int main(){
  int t = 1;
  for (int tc = 1; tc <= t; ++tc) {
    test_case();
  }
  fin.close();
  fout.close();
  return 0;
}