Cod sursa(job #1451168)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 16 iunie 2015 12:32:00
Problema Puteri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#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 , ans;
int prec[(Vmax << 1)+5] , mat[Vmax+5][Vmax+5][Vmax+5];

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 += mode * mat[A][B][C];
            mat[prec[v[i].a]][prec[v[i].b]][prec[v[i].c]]++;
        }
    }

    printf("%d\n", ans);

    return 0;
}