Cod sursa(job #2397733)

Utilizator NeredesinI am not real Neredesin Data 4 aprilie 2019 18:46:25
Problema Puteri Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream in("puteri.in");
ofstream out("puteri.out");

const int NMAX = 1e4 + 1e2;

int n;
int i, j;

int x[NMAX], y[NMAX], z[NMAX];
int dp[65][65][65];
int m[135], s[135];

long long rasp;

void check(int mod, int s) {
  int i, a, b, c;

  memset(dp, 0, sizeof(dp));

  for(i = 1; i <= 128; i++)
    m[i] = i % mod;

  for(i = 1;i <= n; i++) {
    a = m[mod - m[x[i]]];
    b = m[mod - m[y[i]]];
    c = m[mod - m[z[i]]];

    if(a <= 64 && b <= 64 && c <= 64)
      rasp += dp[a][b][c] * s;

    dp[m[x[i]]][m[y[i]]][m[z[i]]]++;
  }
}

bool isp(int t)
{
    for(int i=2;i*i<=t;++i)
        if (t%i==0)
            return 0;
    return 1;
}

int main()
{
  in >> n;

  for(int i = 1; i <= n; i++)
    in >> x[i] >> y[i] >> z[i];

  for(int i = 2; i <= 128; i++)
    if(isp(i) != 0)
      s[i]=1;

  for(int i = 2; i <= 128; i++)
    for(int j = 2; j <= 128; j++)
      if(i != j && isp(i) && isp(j) && i * j <= 128)
        s[i * j] = -1;

  s[30] = s[42] = 1;
  s[66] = s[70] = 1;

  s[78] = s[102] = 1;
  s[105] = s[110] = 1;

  s[114] = 1;


  for(int i = 2; i <= 128; i++) {
    if(s[i]) {
      check(i, s[i]);
    }
  }

  out << rasp << '\n';

  in.close();
  out.close();

  return 0;
}