Pagini recente » Cod sursa (job #3272574) | Infoarena Monthly 2014 - Runda 1 | Cod sursa (job #3233637) | Profil tudgal1001 | Cod sursa (job #31968)
Cod sursa(job #31968)
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 1024
#define MAXS 1000009
int N, S;
int x[MAXN];
vector< pair<int, int> > hash[MAXS];
int query( int S )
{
int p = S % MAXS;
for (vector< pair<int, int> > :: iterator it = hash[p].begin(); it != hash[p].end(); it++)
if ( (*it).first == S )
return (*it).second;
return 0;
}
void add( int S, int val )
{
int p = S % MAXS;
for (vector< pair<int, int> > :: iterator it = hash[p].begin(); it != hash[p].end(); it++)
if ( (*it).first == S )
{
(*it).second += val;
return;
}
hash[p].push_back( make_pair(S, val) );
}
int main()
{
freopen("oite.in", "rt", stdin);
freopen("oite.out", "wt", stdout);
scanf("%d %d", &N, &S);
for (int i = 0; i < N; i++)
scanf("%d", x + i);
int NR = 0;
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
int _S = S - x[i] - x[j];
if (_S < 0) continue;
NR += query(_S);
}
for (int j = 0; j < i; j++)
{
int _S = x[i] + x[j];
if (_S > S) continue;
add(_S, 1);
}
}
printf("%d\n", NR);
return 0;
}