Cod sursa(job #32193)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 17 martie 2007 14:27:22
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <stdio.h>
#include <string>

#define maxx 128
#define ll long long 
#define maxn 100010

int n;
ll sol;
int p[maxx][maxx][maxx];
int a[maxn],b[maxn],c[maxn],d[maxx];

int count(int x)
{
    int i,j,k,rez=0;
    memset(p,0,sizeof(p));
    
    for (i=1;i<=n;++i) p[a[i]%x][b[i]%x][c[i]%x]++;
    
    for (i=0;i<x;++i)
      for (j=0;j<x;++j)
        for (k=0;k<x;++k)
          if ((2*i==x) || (2*j==x) || (2*k==x)) rez+=p[i][j][k]*(p[i][j][k]-1)/2;
          else rez+=p[i][j][k]*p[x-i][x-j][x-k];
          
    for (i=0;i<x;++i)
      for (j=0;j<x;++j)
        if ((2*i==x) || (2*j==x)) rez+=p[i][j][0]*(p[i][j][0]-1)/2;
        else rez+=p[i][j][0]*p[x-i][x-j][0];

    for (i=0;i<x;++i)
      for (j=0;j<x;++j)
        if ((2*i==x) || (2*j==x)) rez+=p[i][0][j]*(p[i][0][j]-1)/2;
        else rez+=p[i][0][j]*p[x-i][0][x-j];
          
    for (i=0;i<x;++i)
      for (j=0;j<x;++j)
        if ((2*i==x) || (2*j==x)) rez+=p[0][j][i]*(p[0][j][i]-1)/2;
        else rez+=p[0][j][i]*p[0][x-j][x-i];
        
    for (i=0;i<x;++i) 
      if (2*i==x) rez+=p[i][0][0]*(p[i][0][0]-1)/2;
      else rez+=p[i][0][0]*p[x-i][0][0];

    for (i=0;i<x;++i) 
      if (2*i==x) rez+=p[0][i][0]*(p[0][i][0]-1)/2;
      else rez+=p[0][i][0]*p[0][x-i][0];

    for (i=0;i<x;++i) 
      if (2*i==x) rez+=p[0][0][i]*(p[0][0][i]-1)/2;
      else rez+=p[0][0][i]*p[0][0][x-i];

    rez+=p[0][0][0]*(p[0][0][0]-1); 
    return rez/2;
}

int diviz(int x,int &rez)
{
    int i,l=0,aux;
    l=0;rez=0;
    
    for (i=1;i*i<=x;++i)
      if (x%i==0) d[++l]=i;
      
    if (d[l]*d[l]==x) aux=l-1;
    else aux=l;
    
    for (i=aux;i>0;i--) d[++l]=x/d[i];
    
    for (i=2;i<=l;++i)
      if (x%d[i]==0)
      {
             rez++;
             while (x%d[i]==0) x/=d[i];
      }
      
    return (1<<rez)==l;
}

int main()
{
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
    
    int i,x,y;
    
    scanf("%d ",&n);
    for (i=1;i<=n;++i) scanf("%d %d %d ",&a[i],&b[i],&c[i]);
    
    for (i=2;i<=maxx;++i)
      if (diviz(i,y))
      {
            x=count(i);
            if (y%2==1) sol+=x;
            else sol-=x;
      }
    
    printf("%lld\n",sol);
    
    return 0;
}