Cod sursa(job #75540)

Utilizator sealTudose Vlad seal Data 2 august 2007 23:48:10
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#define Nm 1024
#define M1 2097143
#define M2 4194301
int A[Nm],n,l;
long long ans;
struct node
{
    int v;
    int n;
    node *next;
};
typedef node *list;
list T1[M1],T2[M2];

void read()
{
    int i;

    freopen("oite.in","r",stdin);
    scanf("%d%d",&n,&l);
    for(i=0;i<n;++i)
        scanf("%d",A+i);
}

void add(list &l, int v)
{
    if(!l)
    {
        l=new node;
        l->v=v;
        l->n=1;
        l->next=NULL;
        return;
    }

    list q=l;

    while(q->next && q->v!=v)
        q=q->next;
    if(q->v==v)
        ++(q->n);
    else
    {
        q->next=new node;
        q->next->v=v;
        q->next->n=1;
        q->next->next=NULL;
    }
}

int search(list l, int v)
{
    while(l && l->v!=v)
        l=l->next;
    if(!l)
        return 0;
    return l->n;
}

void solve()
{
    int i,j,k,s;

    for(i=0;i<n;++i)
        if(A[i]<=l)
            add(T1[A[i]%M1],A[i]);

    for(i=0;i<n;++i)
        for(j=i+1;j<n;++j)
        {
            s=A[i]+A[j];
            if(s<=l)
                add(T2[s%M2],s);
        }

    for(i=0;i<n;++i)
        for(j=i+1;j<n;++j)
        {
            s=A[i]+A[j];
            if(s<=l)
            {
                s=l-s;
                k=search(T2[s%M2],s);
                if(k && A[i]<=s)
                {
                    k-=search(T1[(s-A[i])%M1],s-A[i]);
                    if(A[i]<<1==s)
                        ++k;
                }
                if(k && A[j]<=s)
                {
                    k-=search(T1[(s-A[j])%M1],s-A[j]);
                    if(A[j]<<1==s)
                        ++k;
                }
                if(A[i]+A[j]==s)
                    ++k;
                ans+=k;
            }
        }
    ans/=6;
}

void write()
{
    freopen("oite.out","w",stdout);
    printf("%lld\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}