Cod sursa(job #1971869)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 21 aprilie 2017 10:30:56
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdint.h>
#include <fstream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#define nmax 1025
#define mod 1048583
using namespace std;
fstream f1("oite.in", ios::in);
fstream f2("oite.out", ios::out);
int16_t n;
int32_t suma, a[nmax];
int64_t nrsol;
struct dfgh
{
    int32_t s;
    int16_t in1, in2; ///cu in1<in2
}v[mod];
void citire()
{
    int16_t i;
    f1>>n>>suma;
    for(i=1; i<=n; i++)
        f1>>a[i];
}
int32_t ha(int32_t sum)
{
    int32_t in=0, j;
    do
    {
        j=(sum%mod + (in*( sum%(mod-1)   )))%mod;
        if(!v[j].s) return j;
        in++;

    }while(in< mod);
    return -1;
}
void hashh()
{
    int16_t i, j;
    int32_t in;
    for(i=1; i<=n; i++)
        for(j=i+1; j<=n; j++)
    {
        in= ha(a[i]+a[j]);
        if(in!=-1)
        {
        v[in].s= a[i]+a[j];
        v[in].in1=i;
        v[in].in2=j;
        }
    }

}
void cauta(int32_t x, int32_t sum)
{
    int32_t in=0, j;
    do
    {
        j=(sum%mod + (in*( sum%(mod-1)   )))%mod;

        if((v[j].s== sum)&&(v[x].in2<  v[j].in1)) nrsol++;
        in++;

    }while((in< mod)&&(v[j].s));
}
void sol()
{
    int32_t i, val;
    for(i=0; i<mod; i++)
        if(v[i].s)
    {
        val=suma-v[i].s;
        ///valoare de cautat
        cauta(i, val);
    }
    f2<<nrsol;
}
int main()
{
    citire();
    hashh();
    sol();
    return 0;
}