Pagini recente » Cod sursa (job #1850449) | Cod sursa (job #899374) | Cod sursa (job #1789309) | Monitorul de evaluare | Cod sursa (job #793392)
Cod sursa(job #793392)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;
#define Mod 40007
#define nmax 1050
#define PII pair<int, int>
#define pb push_back
#define mp make_pair
vector<PII> :: iterator it;
vector<PII> H1[Mod], H2[Mod];
int V[nmax], N, M, X;
void Insert1(int val)
{
int now = val % Mod;
for(it = H1[now].begin(); it != H1[now].end(); ++it)
if(it -> first == val)
{
it -> second ++;
return ;
}
H1[now].pb(mp(val, 1));
}
void Insert2(int val)
{
int now = val % Mod;
for(it = H2[now].begin(); it != H2[now].end(); ++it)
if(it -> first == val)
{
it -> second ++;
return ;
}
H2[now].pb(mp(val, 1));
}
int Find1(int val, int lim)
{
int ans = 0;
if(val == lim - val) ans --;
lim -= val;
int now = lim % Mod;
for(it = H1[now].begin(); it != H1[now].end(); ++it)
if(it -> first == lim)
{
ans += it -> second;
break;
}
return ans;
}
int Find2(int val)
{
int now = val % Mod;
for(it = H2[now].begin(); it != H2[now].end(); ++it)
if(it -> first == val)
return it -> second;
return 0;
}
int main()
{
freopen("oite.in", "r", stdin);
freopen("oite.out", "w", stdout);
int i, j;
scanf("%i %i", &N, &M);
for(i = 1; i <= N; i++)
{
scanf("%i", &V[i]);
Insert1(V[i]);
}
for(i = 1; i <= N; i++)
for(j = i + 1; j <= N; j++)
Insert2(V[i] + V[j]);
int ans = 0;
for(i = 1; i <= N; i++)
for(j = i + 1; j <= N; j++)
if(V[i] + V[j] <= M)
{
int val = M - V[i] - V[j];
ans += Find2(val);
if(val >= V[i]) ans -= Find1(V[i], val);
if(val >= V[j]) ans -= Find1(V[j], val);
if(V[i] + V[j] == val) ans ++;
}
printf("%i\n", ans / 6);
return 0;
}