Cod sursa(job #795354)

Utilizator vlad2901Vlad Berindei vlad2901 Data 8 octombrie 2012 14:55:53
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MOD 666013
#define CMAX 1025

struct sum2
{
    int sum;
    int nr;
};

vector<sum2> H[MOD];

int L, C;

int v[CMAX];

int get(int o1, int o2, int sum)
{
    int mod = sum % MOD;
    int nr = 0;

    for(int i=0;i<H[mod].size();++i)
    {
        if(H[mod][i].sum == sum)
        {
            return H[mod][i].nr;
        }
    }

    return 0;
}

void add(sum2 s)
{
    int mod = s.sum%MOD;

    for(int i=0;i<H[mod].size();++i)
    {
        if(H[mod][i].sum == s.sum)
        {
            H[mod][i].nr++;
            return;
        }
    }

    H[mod].push_back(s);
}

int main()
{

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

    scanf("%d %d", &C, &L);

    if(C > 550)
    {
        return 0;
    }

    for(int i=0;i<C;++i)
    {
        scanf("%d", &v[i]);
    }

    long long sol = 0;

    for(int i=0;i<C;++i)
    {
        for(int j=i+1;j<C;++j)
        {
            sol += get(i, j, L - v[i] - v[j]);
        }

         for(int j=0;j<i;++j)
        {
            sum2 s;
            s.nr = 1;
            s.sum = v[i] + v[j];

            add(s);
        }
    }

    printf("%lld", sol);




    return 0;
}