Cod sursa(job #124174)

Utilizator DjSefuWrong name DjSefu Data 18 ianuarie 2008 13:46:40
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<string.h>
FILE *f=fopen("trapez.in","r"),
     *g=fopen("trapez.out","w");
long p[1007][2],n,i,j,ox,oy,t[500555],s,tr,x,k;
char a[500555][40],au[40];
long q(long a)
{ if(a>=0) return a;
  return -a;
}
long cmmdc(long a,long b)
{ long r;
  r=a%b;
  while(r!=0){ a=b;
	       b=r;
	       r=a%b;
	     }
  return b;
}
int main()
{ fscanf(f,"%ld",&n);
  for(i=1;i<=n;++i) fscanf(f,"%ld %ld",&p[i][0],&p[i][1]);
  for(i=1;i<=n;++i) for(j=i+1;j<=n;++j){ if(p[i][0]==p[j][0]) oy++;
					 else if(p[i][1]==p[j][1]) ox++;
					 else { s=p[i][1]-p[j][1];
						tr=p[i][0]-p[j][0];
						x=cmmdc(q(s),q(tr));
						if(s<0&&t<0) s/=-x,tr/=-x;
						else if(s<0||k<0) s=-q(s)/x,tr=q(k)/x;
						else s/=x,tr/=x;
						sprintf(au,"%ld/%ld",s,tr);
						for(x=1;x<=k&&strcmp(a[x],au);++x);
						if(x>k) strcpy(a[++k],au),t[k]=1;
						else ++t[x];
					      }
				       }
  n=0;
  n+=(ox-1)*ox/2+oy*(oy-1)/2;
  for(i=1;i<=k;++i) n+=t[i]*(t[i]-1)/2;
  fprintf(g,"%ld\n",n);
  fclose(f);
  fclose(g);
  return 0;
}