Cod sursa(job #682359)

Utilizator balakraz94abcd efgh balakraz94 Data 18 februarie 2012 21:54:59
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define infile "oite.in"
#define outfile "oite.out"
#define MOD 666013
#define pb push_back
#define ll long long
#define n_max 1030
#define FOR(g) \
   for(vector < hash > ::iterator it = g.begin(); it!=g.end(); ++it)
#define FOR2(g) \
   for(vector < ll > ::iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;

struct hash {
	int a, b;
	ll s;
};
	
vector < hash > T[MOD];

vector < ll > T2[MOD];

ll v[n_max], L;

int N;

ll Sol;

vector < int > vx; 

inline int h(ll x){
	return  x % MOD;}




void citeste()
{
	freopen(infile,"r",stdin);
	
    scanf("%d %lld",&N, &L);
	
	for(int i=1; i <= N; ++i)
		scanf("%lld",&v[i]);
	
	fclose(stdin);
}


inline ll transf(int a, int b, int c, int d)
{
	vx.clear();
	vx.pb(a);
	vx.pb(b);
	vx.pb(c);
	vx.pb(d);
	
	sort(vx.begin(), vx.end());
	
	ll where = 0;
	for(int i=0; i<4; i++)
		where = where * 10 + v[vx[i]];
	
	return where;
}


inline int good(ll where, int a, int b, int c, int d)
{
	if(a == c || a == d || b == c || b == d)
		return 0;
	
	FOR2(T2[h(where)])
		if(*it == where)
			return 0;
    return 1;	
}



void rezolva()
{
	hash r;
	ll part_sum;
	
	for(int i=1; i<=N; ++i)
		for(int j=i+1; j<=N; ++j)
			if(v[i] + v[j] <= L)
			{
				r.a = i;
				r.b = j;
				r.s = v[i] + v[j];
				
				T[h(r.s)].pb(r);
				
				part_sum = L - r.s;
				FOR(T[h(part_sum)])
					if((*it).s == part_sum)
					{
						ll where = transf((*it).a, (*it).b, i, j);
						
						if(good(where, (*it).a, (*it).b, i, j))
						{   
							Sol++;
							T2[h(where)].pb(where);
						}
					}
			}	
}


void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%lld\n",Sol);	
	
	fclose(stdout);
}


int main()
{
	citeste();
	rezolva();
	afiseaza();	
	
	return 0;
}