Cod sursa(job #285910)

Utilizator holleraaaa vvvv holler Data 23 martie 2009 09:53:38
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "puteri.in"
#define FOUT "puteri.out"
#define MAX_N 100005
#define MAX_P 130

typedef struct triple
{
        int x, y, z;
};

int N;
triple A[MAX_N];
int D[MAX_P][MAX_P][MAX_P];
int P[MAX_P];
int BEST;
const int Pr[15] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};

        inline int impar (int c)
        {
               int i, cnt = 0;
               for (i = 0; i < 15; ++i)
                   if (c % Pr[i] == 0) ++cnt;
               if (cnt & 1) return 1;
               return 0;
        }
        
        inline int ABS (int a)
        {
               if (a < 0) return -a; else return a;
        } 
        
        void solve ()
        {
             int r, i;
             for (r = 1; r <= 64; ++r)
             {
                 for (i = 1; i <= N; ++i)
                     ++D[A[i].x%r][A[i].y%r][A[i].z%r];
                     
                 int x, y, z;
                 for (x = 0; x < r/2 + 1; ++x)
                     for (y = 0; y < r/2 + 1; ++y)
                         for (z = 0; z < r/2 + 1; ++z)
                             if (2*x % r == 0 && 2*y % r == 0 && 2*z % r == 0)
                                P[r] += (D[x][y][z] * (D[x][y][z] - 1)) / 2;
                             else
                             {
                                 int rx = ABS(r - x)%r;
                                 int ry = ABS(r - y)%r;
                                 int rz = ABS(r - z)%r; 
                                 P[r] += (D[x][y][z] * D[rx][ry][rz]);
                             }
                 memset (D, 0, sizeof (D));
             }
             
             for (i = 2; i <= 128; ++i)
             {
              //   printf ("%d ", P[i]);
                 if (impar(i)) BEST += P[i];
                          else BEST -= P[i];
             }
             printf ("%d\n", BEST);     
        }
        
        int main ()
        {
            int i;
            freopen (FIN, "r", stdin);
            freopen (FOUT, "w", stdout);
            
            scanf ("%d", &N);
            for (i = 1; i <= N; ++i)
                scanf ("%d %d %d", &A[i].x, &A[i].y, &A[i].z);
                
            solve ();
            
            return 0;
        }