Cod sursa(job #495099)

Utilizator marius21Marius Petcu marius21 Data 23 octombrie 2010 23:30:52
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstdlib>
#include <list>

using namespace std;

FILE *fin=fopen("oite.in","r");
FILE *fout=fopen("oite.out","w");

struct pnt {
	int x,y;
};

int a[1024];
list<pnt> v[254];

unsigned char crc8(int a)
{
	unsigned char crc = 0;
	for (int i=0; i<sizeof(int)*8+8; i++)
	{
		crc=((crc<<1)|(a&1))^0xD5;
		a=a>>1;
	}
	return crc;
}

int main (int argc, char * const argv[]) {
	int n,l;
	fscanf(fin, "%d%d",&n,&l);
	for (int i=0; i<n; i++)
		fscanf(fin, "%d",&a[i]);
	for (int i=0; i<n; i++)
		for (int j=i+1; j<n; j++)
		{
			pnt tmp;
			tmp.x= i;
			tmp.y= j;
			v[crc8(a[i]+a[j])].push_back(tmp);
		}
	int sum = 0;
	for (int i=0; i<n; i++)
		for (int j=i+1; j<n; j++)
		{
			list<pnt> & li = v[crc8(l-a[i]-a[j])];
			for (list<pnt>::iterator ii = li.begin(); ii!=li.end(); ii++)
			{
				if ((*ii).x<=i) continue;
				if ((*ii).x<=j) continue;
				if ((*ii).y<=i) continue;
				if ((*ii).y<=j) continue;
				if ((a[(*ii).x]+a[(*ii).y])!=(l-a[i]-a[j])) continue;
				sum++;
			}
		}
	fprintf(fout, "%d",sum);
	fclose(fin);
	fclose(fout);
    return 0;
}