Cod sursa(job #58114)

Utilizator MariusMarius Stroe Marius Data 4 mai 2007 01:08:20
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <map>

using namespace std;

const char iname[] = "oite.in";
const char oname[] = "oite.out";

#define MAX_N 1024

typedef long long i64;

int C;

int L;

int A[MAX_N];

map <int, int> cnt1, cnt2;

void read_in(void)
{
	scanf("%d", &C);
	scanf("%d", &L);
	for (int i = 0; i < C; ++ i)
		scanf("%d", &A[i]);
}

int main(void)
{
	freopen(iname, "r", stdin);
	read_in();

	i64 ans = 0;

	for (int i = 0; i < C; ++ i) {
		if (A[i] <= L)
			cnt1[A[i]] ++;
		for (int j = i + 1; j < C; ++ j)
			if (A[i] + A[j] <= L)
				cnt2[A[i] + A[j]] ++;
	}
	for (int i = 0; i < C - 1; ++ i) {
		for (int j = i + 1; j < C; ++ j) {
			int sum = L - A[i] - A[j];
			if (sum >= 0) {
				ans += (i64)cnt2[sum];
				if (sum == A[i] + A[j])
					ans --;
				if (sum >= A[i]) {
					ans -= (i64)cnt1[sum - A[i]];
					if (sum - A[i] == A[j])
						ans ++;
					if (sum - A[i] == A[i])
						ans ++;
				}
				if (sum >= A[j]) {
					ans -= (i64)cnt1[sum - A[j]];
					if (sum - A[j] == A[i])
						ans ++;
					if (sum - A[j] == A[j])
						ans ++;
				}
			}
		}
	}
	freopen(oname, "w", stdout);
	printf("%lld\n", ans / 6);

	return 0;
}