Pagini recente » Cod sursa (job #1440217) | Cod sursa (job #207632) | Cod sursa (job #948866) | Cod sursa (job #506427) | Cod sursa (job #31956)
Cod sursa(job #31956)
#include<stdio.h>
#include<stdlib.h>
const int MAXN = 1024;
struct sms
{
int val;
int count;
sms *next;
};
int n, sum;
int nr[MAXN];
long long sol=0;
int rs[1000102];
const int mod = 2000007;
sms *h[2000102];
inline void sol1()
{
int i, j, s;
sms *it;
for (i=0; i<n; ++i)
{
for (j=i+1; j<n; ++j)
{
s = sum - (nr[i] + nr[j]);
if (s>=0)
{
for (it = h[s%mod]; it != NULL; it = it->next)
if (it->val == s)
break;
if (it != NULL)
sol += (long long) it->count;
}
}
for (j=0; j<i; ++j)
{
s = nr[i] + nr[j];
if (s <= sum)
{
for (it = h[s%mod]; it != NULL; it = it->next)
if (it->val == s)
break;
if (it == NULL)
{
sms *nou = (sms *) malloc(sizeof(sms));
nou->val = s; nou->count = 1; nou->next = h[s%mod];
h[s%mod] = nou;
}
else
it->count++;
}
}
}
}
inline void sol2()
{
int i, j, s;
for (i=0; i<n; ++i)
{
for (j=i+1; j<n; ++j)
{
s = sum - (nr[i] + nr[j]);
if (s>=0)
sol += (long long) rs[s];
}
for (j=0; j<i; ++j)
{
s = nr[i] + nr[j];
if (s<=sum)
++rs[s];
}
}
}
int main(void)
{
freopen("oite.in", "rt", stdin);
freopen("oite.out", "wt", stdout);
scanf("%d%d", &n, &sum);
for (int i=0; i<n; ++i)
scanf("%d", &nr[i]);
if (sum>1000100) sol1();
else sol2();
printf("%Ld\n", sol);
return 0;
}