Pagini recente » Cod sursa (job #764493) | Monitorul de evaluare | Cod sursa (job #270639) | Cod sursa (job #1908913) | Cod sursa (job #285910)
Cod sursa(job #285910)
#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;
}