Cod sursa(job #1417657)

Utilizator hrazvanHarsan Razvan hrazvan Data 10 aprilie 2015 19:09:09
Problema Puteri Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#define MAXN 100000
#define MAXP 127
#define PRIMES 20
int x[MAXN], y[MAXN], z[MAXN], p[PRIMES] = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73};//, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127};
int ma[MAXP][MAXP][MAXP];

int main(){
  FILE *in = fopen("puteri.in", "r");
  int n, i;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++)
    fscanf(in, "%d%d%d", &x[i], &y[i], &z[i]);
  fclose(in);
  int k, j, ii;
  long long rez = 0, adun;
  for(i = 0; i < n; i++)
    ma[x[i] & 1][y[i] & 1][z[i] & 1]++;
  for(i = 0; i < 2; i++)
    for(j = 0; j < 2; j++)
      for(ii = 0; ii < 2; ii++)
        rez += 1LL * ma[i][j][ii] * (ma[i][j][ii] - 1) / 2;
  for(k = 0; k < PRIMES; k++){
    for(i = 0; i < p[k]; i++)
      for(j = 0; j < p[k]; j++)
        for(ii = 0; ii < p[k]; ii++)
          ma[i][j][ii] = 0;
    for(i = 0; i < n; i++){
      ma[x[i] % p[k]][y[i] % p[k]][z[i] % p[k]]++;
    }
    adun = 0;
    for(i = 0; i < p[k]; i++){
      for(j = 0; j < p[k]; j++){
        for(ii = 0; ii < p[k]; ii++){
          if(!(i == 0 && j == 0 && ii == 0))
            adun += 1LL * ma[i][j][k] * ma[(p[k] - i) % p[k]][(p[k] - j) % p[k]][(p[k] - ii) % p[k]];
        }
      }
    }
    adun /= 2;
    adun += 1LL * ma[0][0][0] * (ma[0][0][0] - 1) / 2;
    rez += adun;
  }
  FILE *out = fopen("puteri.out", "w");
  fprintf(out, "%lld", rez);
  fclose(out);
  return 0;
}