Cod sursa(job #1512795)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 28 octombrie 2015 17:34:46
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MOD = 7919;
const int NMAX = 1100;

int N, S;
vector< pair<int, int> > H[MOD];
unsigned int v[NMAX];

unsigned int f (unsigned int a) {
    return a % MOD;
}

int findH (unsigned int Q) {
    unsigned int r = f (Q);

    for (int i = 0; i < H[r].size (); i++) {
        if (H[r][i].first == Q) {
            return i;
        }
    }

    return -1;
}

void insertH (int Q) {
    int pos = findH (Q);
    if (pos != -1) {
        H[ f(Q) ][pos].second ++;
    }
    else {
        H[ f(Q) ].push_back ( make_pair (Q, 1) );
    }
}

int main () {
    freopen ("oite.in", "r", stdin);
    freopen ("oite.out", "w", stdout);

    scanf ("%u%u", &N, &S);
    for (int i = 1; i <= N; i++) {
        scanf ("%u", &v[i]);
    }

    int ANS = 0;
    for (int i = 1; i < N; i++) {
        for (int j = i + 1; j <= N; j++) {
            int s = v[i] + v[j], pos = findH (S - s);

            if (S - s > 0 && pos != -1) {
                ANS += H[ f(S - s) ][pos].second;
            }

        }

        for (int j = 1; j < i; j++) {
            insertH (v[i] + v[j]);
        }
    }

    printf ("%d\n", ANS);

    return 0;
}