Cod sursa(job #75539)

Utilizator sealTudose Vlad seal Data 2 august 2007 23:09:08
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include<stdio.h>
#define Nm 1024
#define M 524287
int A[Nm],Nr1[M],Nr2[M],n,l;
long long ans;
struct node
{
    int v;
    int n;
    node *next;
};
typedef node *list;
list T[M],T1[M],T2[M];

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,p1,p2,k,s;

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

    for(i=0;i<n;++i)
        for(j=i+1;j<n;++j)
        {
            s=A[i]+A[j];
            if(s<=l)
            {
                p1=s%M;
                p2=s%(M-1);
                if(search(T1[p1],s))
                {
                    add(T1[p1],s);
                    continue;
                }
                if(search(T2[p2],s))
                {
                    add(T2[p2],s);
                    continue;
                }
                if(Nr1[p1]<=Nr2[p2])
                {
                    add(T1[p1],s);
                    ++Nr1[p1];
                }
                else
                {
                    add(T2[p2],s);
                    ++Nr2[p2];
                }
            }
        }

    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(T1[s%M],s);
                if(!k)
                    k=search(T2[s%(M-1)],s);
                if(A[i]<=s)
                {
                    k-=search(T[(s-A[i])%M],s-A[i]);
                    if(A[i]+A[i]==s)
                        ++k;
                }
                if(A[j]<=s)
                {
                    k-=search(T[(s-A[j])%M],s-A[j]);
                    if(A[j]+A[j]==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;
}