Cod sursa(job #14328)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 8 februarie 2007 19:11:15
Problema Triplete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#define fin  "triplete.in"
#define fout "triplete.out"
#define Nmax 4097
#define Bmax 257
#define Nrmax 1<<16
#define Lmax 65537
int n,m,sol,v[Nmax][Bmax],nrb[Nrmax+1],list[Lmax][2];

FILE *in,*out;

void insert(int a,int b) {
int p1,p2;
	p1=a/16;
	p2=a%16;
	p2=1<<p2;
	v[b][p1]=v[b][p1]|p2;
}

int main() {
int i,j,a,b,bit,lim,tmp;
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%i%i",&n,&m);

	for (i=1;i<=m;++i) {
		fscanf(in,"%i%i",&a,&b);
		--a; --b;
		insert(a,b);
		insert(b,a);
		list[i][0]=a;
		list[i][1]=b;
	}
	
	nrb[1]=1;

	for (i=2;i<=Nrmax;) {
		j=i;
		lim=i<<1;
		for (j=i;j<lim;++j) nrb[j]=1+nrb[j-i];
		i=lim;
	}
/*
	for (i=0;i<32;++i) printf("%i ",nrb[i]);

	for (i=0;i<n;++i) {
		
		for (int j=0;j<=16;++j) {
			bit=v[i][0]&(1<<j);
			if (bit) bit=1;
			printf("%i",bit);
		}
		printf("\n");
	}
*/
	
	for (i=1;i<=m;++i) {
		a=list[i][0]; b=list[i][1];
		for (j=0;j<Bmax;++j) {
			tmp=v[a][j]&v[b][j];
			sol+=nrb[tmp];
		}
		
	}

	sol/=3;

	fprintf(out,"%i\n",sol);

	fclose(in); fclose(out);

	return 0;
}