Cod sursa(job #31891)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 16 martie 2007 22:13:42
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
#include<stdlib.h>

const int MAXN = 1024;

struct sms
{
    int val;
    int count;
    sms *next;
};

int n, sum;
int nr[MAXN];

long long sol=0;

int rs[1000102];

const int mod = 2000007;
sms *h[2000102];

inline void sol1()
{
    int i, j, s;
    sms *it;
    for (i=0; i<n; ++i)
    {
        for (j=i+1; j<n; ++j)
        {
            s = sum - (nr[i] + nr[j]);
            if (s>=0)
            {
                for (it = h[s%mod]; it != NULL; it = it->next)
                    if (it->val == s)
                        break;
                if (it != NULL)
                    sol += (long long) it->count;
            }
        }
        for (j=0; j<i; ++j)
        {
            s = nr[i] + nr[j];
            if (s <= sum)
            {
                for (it = h[s%mod]; it != NULL; it = it->next)
                    if (it->val == s)
                        break;
                if (it == NULL)
                {
                    sms *nou = (sms *) malloc(sizeof(sms));
                    nou->val = s; nou->count = 1; nou->next = h[s%mod];
                    h[s%mod] = nou;
                }
                else
                    it->count++;
            }
        }
    }
}

inline void sol2()
{
    int i, j, s;
    for (i=0; i<n; ++i)
    {
        for (j=i+1; j<n; ++j)
        {
            s = sum - (nr[i] + nr[j]);
            if (s>=0)
                sol += (long long) rs[s];
        }
        for (j=0; j<i; ++j)
        {
            s = nr[i] + nr[j];
            if (s<=sum)
                ++rs[s];
        }
    }
}

int main(void)
{
    freopen("oite.in", "rt", stdin);
    freopen("oite.out", "wt", stdout);

    scanf("%d%d", &n, &sum);
    for (int i=0; i<n; ++i)
        scanf("%d", &nr[i]);

    if (sum>1000100) sol1();
    else sol2();

    printf("%Ld\n", sol);

    return 0;
}