Cod sursa(job #425289)

Utilizator vladiiIonescu Vlad vladii Data 25 martie 2010 17:01:49
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <vector>
using namespace std;
#define MOD 100003

int N, L, A[1030];
long long sol;
vector<pair<int, pair<int, int> > > V[100004];

int Verifica(int a, int b, int c, int d) {
    if(a==b || a==c || a==d) { return 0; }
    if(b==c || b==d) { return 0; }
    if(c==d) { return 0; }
    return 1;
}

int main() {
    FILE *f1=fopen("oite.in", "r"), *f2=fopen("oite.out", "w");
    int i, j, k, p, q;
    fscanf(f1, "%d %d", &N, &L);
    for(i=1; i<=N; i++) {
         fscanf(f1, "%d", &A[i]);
    }
    sort(A+1, A+N+1);
    for(i=1; i<=N; i++) {
         for(j=i+1; j<=N; j++) {
              q=(A[i]+A[j])/MOD; p=(A[i]+A[j])%MOD;
              V[p].push_back(make_pair(q, make_pair(i, j)));
         }
    }
    for(k=1; k<=N; k++) {
         for(j=k+1; j<=N; j++) {
              //caut suma L-A[k]-A[j]  (+A[k]+A[j])
              p=(L-A[k]-A[j])%MOD; q=(L-A[k]-A[j])/MOD;
              if(p<0 || q<0) { continue; }
              for(vector<pair<int, pair<int, int> > >::iterator it=V[p].begin(); it!=V[p].end(); it++) {
                   if((*it).first==q) {
                        if(Verifica(k, j, (*it).second.first, (*it).second.second)) { sol++; }
                   }
              }
         }
    }
    fprintf(f2, "%lld\n", sol/6);
    fclose(f1); fclose(f2);
    return 0;
}