Cod sursa(job #66913)

Utilizator info_arrandrei gigea info_arr Data 21 iunie 2007 18:19:45
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
using namespace std;

#define MAX_N 100005
#define MAX_P 70

#include <stdio.h>
#include <fstream>

FILE *fin=fopen("puteri.in","r"),
     *fout=fopen("puteri.out","w");
     
typedef struct
 {
   short x,y,z;
 } data;
 
int n,i;
int nr[MAX_P][MAX_P][MAX_P];
data q[MAX_N];
int a[MAX_P<<1]; 

int max(int a, int b, int c)
{
  if (a<b) a=b;
  if (c<a) c=a;
  return c;
} 

int paritate(int a)
{
 int i,ct=0;
 i=2;
 if (a==1) return 1; 
 while (a>1)
 { if (a%i==0)
    {
      ct++;
      while (a%i==0) a/=i;
    }
   i++;
 } 
 return ct;     
}
  
void solve(int &b, int p)
{
  int i;
  int r1,r2,r3; 
  int m;
  memset(nr,0,sizeof(nr));
  for (i=1; i<=n; i++) 
   nr[q[i].x%p][q[i].y%p][q[i].z%p]++;
  for (r1=0; r1<=10; r1++)
   for (r2=0; r2<=10; r2++)
    for (r3=0; r3<=10; r3++)
     {
      m=max(r1,r2,r3);         
      for (i=m; i<=m+m+1; i++)
       if (((r1<<1)%p==0)&&((r2<<1)%p==0)&&((r3<<1)%p==0))
        { b+=nr[r1][r2][r3]*(nr[r1][r2][r3]-1)/2; break; }
       else 
        b+=nr[r1][r2][r3]*nr[(i-r1)%p][(i-r2)%p][(i-r3)%p]/2;
     }   
}   
  
int main()
{
  fscanf(fin,"%d",&n);
  for (i=1; i<=n; i++) 
   fscanf(fin,"%d %d %d",&q[i].x,&q[i].y,&q[i].z);
  for (i=2; i<=128; i++)
   solve(a[i],i);
  int sol=0; 
  for (i=1; i<=128; i++)   
   if (paritate(a[i])&1) 
    sol+=a[i]; else sol-=a[i];
  fprintf(fout,"%d\n",sol); 
  return 0; 
}