Pagini recente » Cod sursa (job #1346957) | Istoria paginii runda/pregatire_lot_juniori_1/clasament | Cod sursa (job #1609548) | Cod sursa (job #1289519) | Cod sursa (job #2008065)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define a first.first
#define b first.second
#define c second
using namespace std;
const int Nmax = 100000;
const int Vmax = 64;
int i , n , rest , mode;
int prec[(Vmax << 1)+5] , mat[Vmax+5][Vmax+5][Vmax+5];
long long ans;
pair < pair < int , int > , int > v[Nmax+10];
bool check(int x)
{
mode = 0;
for (int i = 2; i * i <= x; ++i)
if (x % i == 0)
{
x /= i;
if (x % i == 0)
return false;
mode++;
}
if (x > 1) mode++;
if (mode & 1) mode = 1; else mode = -1;
return true;
}
int main()
{
freopen("puteri.in","r",stdin);
freopen("puteri.out","w",stdout);
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf("%d %d %d", &v[i].a, &v[i].b, &v[i].c);
for (rest = 2; rest <= (Vmax << 1); ++rest)
{
if (!check(rest))
continue;
memset(mat , 0 , sizeof(mat));
for (i = 0; i <= (Vmax << 1); ++i)
prec[i] = i % rest;
for (i = 1; i <= n; ++i)
{
int A = prec[rest - prec[v[i].a]]; int B = prec[rest - prec[v[i].b]]; int C = prec[rest - prec[v[i].c]];
if (A <= Vmax && B <= Vmax && C <= Vmax)
ans += 1LL * mode * mat[A][B][C];
mat[prec[v[i].a]][prec[v[i].b]][prec[v[i].c]]++;
}
}
printf("%lld\n", ans);
return 0;
}