Pagini recente » Cod sursa (job #1302341) | Cod sursa (job #843307) | Cod sursa (job #708152) | Cod sursa (job #2119870) | Cod sursa (job #1199633)
#include<cstdio>
#include<unordered_map>
#include<utility>
#include<vector>
using namespace std;
const int MOD = 66013;
vector<pair<int, int>> h[MOD];
int oite[1024];
char sir[15000];
int main() {
FILE *in = fopen("oite.in", "r+");
FILE *out = fopen("oite.out", "w+");
int n, l, i, j, sol = 0, mod, nr = 0;
fscanf(in, "%d %d", &n, &l);
fgets(sir, 15000, in);
for(i = 0; sir[i] != '\0'; i++) {
if(sir[i] == ' ') {
nr++;
} else {
oite[nr] = oite[nr] * 10 + sir[i] - '0';
}
}
// insereaza in hash toate perechile de numere; cheia = suma lor
for(i = 0; i < n; i++) {
for(j = i + 1; j < n; j++) {
h[(oite[i] + oite[j]) % MOD].push_back(make_pair(oite[i] + oite[j], i));
}
}
// pt fiecare pereche de numere, cauta in hash l - suma lor si verifica
// daca numerele sunt diferite
for(i = 0; i < n; i++) {
for(j = i + 1; j < n; j++) {
int cauta = l - oite[i] - oite[j];
if(cauta > 0) {
mod = cauta % MOD;
for(vector<pair<int, int>>::iterator it = h[mod].begin(); it != h[mod].end(); ++it) {
if(it->first == cauta && it->second > j) {
sol++;
// cout << i << " " << j << " " << it->second << endl;
}
}
}
}
}
fprintf(out, "%d\n", sol);
return 0;
}