Cod sursa(job #1369030)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 martie 2015 21:14:45
Problema Oite Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#define MOD 1050051
#define MAXN 1024
#define MAXM (MAXN*(MAXN+1)/2)
int v[MAXN+1], val[MAXM+1], next[MAXM+1], fr[MAXM+1], lista[MOD], m;
inline int oite(int x){
    int p=lista[x%MOD], sol=0;
    while((p!=0)&&(sol==0)){
        if(val[p]==x){
            sol=fr[p];
        }
        p=next[p];
    }
    return sol;
}
inline void adauga(int x){
    int p=lista[x%MOD], f=0;
    while((p!=0)&&(f==0)){
        if(val[p]==x){
            f=p;
        }
        p=next[p];
    }
    if(f==0){
        m++;
        val[m]=x;
        fr[m]=1;
        next[m]=lista[x%MOD];
        lista[x%MOD]=m;
    }else{
        fr[f]++;
    }
}
int main(){
    int n, k, i, j;
    long long ans;
    FILE *fin, *fout;
    fin=fopen("oite.in", "r");
    fout=fopen("oite.out", "w");
    fscanf(fin, "%d%d", &n, &k);
    for(i=1; i<=n; i++){
        fscanf(fin, "%d", &v[i]);
    }
    ans=0;
    adauga(v[n]+v[n-1]);
    for(i=n-2; i>1; i--){
        for(j=1; j<i; j++){
            if(k>=v[i]+v[j]){
                ans+=oite(k-v[i]-v[j]);
            }
        }
        for(j=i+1; j<=n; j++){
            adauga(v[i]+v[j]);
        }
    }
    fprintf(fout, "%lld\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}