Cod sursa(job #539560)

Utilizator cosmyoPaunel Cosmin cosmyo Data 23 februarie 2011 02:03:08
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define f first
#define s second
using namespace std;
vector < pair<int,int > > v[666015];
const int N = 1028;
const int MOD = 666013;
int C[N], n, L, val;

int find(int i1, int i2) {
	int i, nr = 0;
	int val = (L - C[i1] - C[i2]);
	int k = val % MOD;
	int m = i2;
	if(val > 0) {
		for(i = 0 ; i < v[k].size(); ++i)
			if(C[v[k][i].f] + C[v[k][i].s] == val && v[k][i].f > m && v[k][i].s > m)
				++nr;//, printf("%d %d %d %d\n", i1, i2, v[k][i].f, v[k][i].s);
	}

	return nr;
}

int main() {
	freopen("oite.in", "r", stdin);
	freopen("oite.out", "w", stdout);
	int i, nr = 0, j;
	scanf("%d %d", &n, &L);
	for(i = 1; i <= n; ++i)
		scanf("%d", &C[i]);
	sort(C + 1, C + n + 1);
	for(i = 1; i <= n; ++i)
		for(j = i + 1; j <= n; ++j)
			v[(C[i] + C[j]) % MOD].push_back(make_pair(i, j));
	
	for(i = 1; i <= n; ++i)
		for(j = i + 1;j <= n; ++j) 
			nr += find(i, j);
	/*
	for(i = 1; i <= MOD; ++i)
		if(v[i].size()) {
			printf("%d\n", i);
			for(j =  0; j < v[i].size(); ++j)
				printf("%d %d\n", C[v[i][j].f], C[v[i][j].s]);
			printf("\n");
		}
	*/
	printf("%d\n", nr);

	return 0;
}