Cod sursa(job #28677)

Utilizator AdixSuciu Adrian Adix Data 8 martie 2007 10:16:27
Problema Triplete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <math.h>
const int B=32;
long m,n;
long solutie;
long muc[65537][2];
unsigned long mat[4098][300];

void citire(){
		 FILE *in;
		 long i,x,y,j,y1,x1;
		 in=fopen("triplete.in","r");
		 fscanf(in,"%ld %ld",&n,&m);
		 j=0;

		 for(i=0;i<m;i++){
			 fscanf(in,"%ld %ld",&x,&y);
			 x--;y--;
			 muc[i][0]=x;muc[i][1]=y;
			 j=y/B;
			 y1=y%B;
//	 if(j!=0) y1++;
			 mat[x][j]+= 1<<y1;
			 j=x/B;
			 x1=x%B;
		//	 if(j!=0||x==B) x1++;
			 mat[y][j]+= 1<<x1;

			 }
		 fclose(in);
		 }


long formula(long k,long l,int mm){

long x,i,j;
x=mat[k][mm]&mat[l][mm];
i=B+1;j=0;
while(x!=0){

if((x-(1<<i))>=0){ j++;x=x-(1<<i);}
i--;
}
return j;

}

void procesare(){
long i,k,l,j;
for(i=0;i<m;i++){
		k=muc[i][0];
		l=muc[i][1];
//		for(j=0;j<=n/B;j++)
j=0;
	 do{
			solutie+=formula(k,l,j);
			j++;
			}while(j<=(n/B));
						}
}
void scriere(){
		 FILE *out;
		 out=fopen("triplete.out","w");
		 fprintf(out,"%ld",solutie/3);
		 fclose(out);
		 }

int main(){
		 citire();
		 procesare();
		 scriere();
		 return 0;
		 }