Cod sursa(job #2216829)

Utilizator ShutterflyFilip A Shutterfly Data 28 iunie 2018 03:08:10
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#include<unordered_map>
#include<utility>
#include<vector>
#define MAX_TERMS 4
#define MAXL 1000000
#define MAXN 1024
#define MOD 666013
FILE*fin,*fout;

void bkt(int level);
int N,L;
long long ans;
int v[MAXN+1];
int sol[MAX_TERMS+1];
//std::unordered_map<int,std::vector<std::pair<int,int> > > mp;
int ult=0;

std::vector<std::pair<short int,short int> > mp[MOD + 1];
///heavy computing...

int main()
{
    fin=fopen("oite.in","r");
    fout=fopen("oite.out","w");

    fscanf(fin,"%d%d",&N,&L);

    for(int i=1; i<=N; i++)
    {
        fscanf(fin,"%d",&v[i]);
    }
    for(int i=1; i<=N; i++)
    {
        for(int j=i+1; j<=N; j++)
        {
            if(v[i]+v[j]<=L)
            {
                int sum = v[i] + v[j];
                sum %= MOD;
                mp[sum].push_back(std::make_pair(i,j));
            }
        }
    }

    for(int i=1; i<=N; i++)
    {
        for(int j=i+1; j<=N; j++)
        {
            if(v[i]+v[j]<=L)
            {
                int reqsum = (L-v[i]-v[j]) % MOD;
                std::vector<std::pair<short int,short int > >::iterator beg=mp[reqsum].begin();
                std::vector<std::pair<short int,short int > >::iterator fin=mp[reqsum].end();
                for(std::vector<std::pair<short int,short int > >::iterator it=beg; it!=fin; it++)
                {
                    if(i!=(it->first) && j!=(it->first) && i!=(it->second) && j!=(it->second))
                    {
                        if (v[it->first] + v[it->second] == L - v[i] - v[j]) //Sanity Check
                            ans++;
                    }
                }
            }
        }
    }
    fprintf(fout,"%lld",ans/6);
    fclose(fin);
    fclose(fout);

    return 0;
}

void bkt(int level)
{
    if(level==MAX_TERMS+1)
    {
        long long sum=0;
        for(int i=1; i<=MAX_TERMS; i++)
        {
            sum+=v[sol[i]];
        }
        if(sum==L)
        {
            ans++;
        }
    }
    else
    {
        for(int i=sol[level-1]+1; i<=N-MAX_TERMS+level; i++)
        {
            sol[level]=i;
            bkt(level+1);
        }
    }
}