Cod sursa(job #1607576)

Utilizator SilviuIIon Silviu SilviuI Data 21 februarie 2016 13:40:04
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <vector>
#include <utility>
#define nmax 1100
#define mod 100027

using namespace std;

int n,m,sol;
int t[nmax];
vector < pair<int,int> > g[mod+10];

void add_inhash(int x)
{
    int y=x%mod;

    for (int i=0;i<(int)g[y].size();i++)
        if (g[y][i].first==x) {
            g[y][i].second++; return;
    }

    g[y].push_back(make_pair(x,1));
}

void remove_fromhash(int x)
{
    int y=x%mod;

    for (int i=0;i<(int)g[y].size();i++)
        if (g[y][i].first==x) {
            g[y][i].second--;
            if (g[y][i].second==0) g[y].erase(g[y].begin()+i);
            return;
    }

}

int nrhash(int x)
{
    int y=x%mod;

    for (int i=0;i<(int)g[y].size();i++)
        if (g[y][i].first==x) return g[y][i].second;

    return 0;
}

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

    scanf("%d %d",&n,&m);

    for (int i=1;i<=n;i++) scanf("%d",&t[i]);

    for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++)
            add_inhash(t[i]+t[j]);

    for (int i=1;i<=n;i++) {

        for (int j=i+1;j<=n;j++) remove_fromhash(t[i]+t[j]);

        for (int j=1;j<=i-1;j++)
            if (m-(t[i]+t[j])>0) sol=sol+nrhash(m-(t[i]+t[j]));

    }

    printf("%d",sol);

    return 0;
}