Cod sursa(job #2382823)

Utilizator nurof3nCioc Alex Andrei nurof3n Data 18 martie 2019 18:19:09
Problema Puteri Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>



#define MAX_P 65

#define MAX_N 100005

#define FIN "puteri.in"

#define FOUT "puteri.out"

#define ll long long



int N, cnt[MAX_P][MAX_P][MAX_P]; ll Res;

char A[MAX_N], B[MAX_N], C[MAX_N];



int main(void)

{

    int i, j, k, p, t, sgn, a, b, c;



    freopen(FIN, "r", stdin);

    freopen(FOUT, "w", stdout);



    scanf("%d", &N);

    for (i = 0; i < N; i++)

        scanf("%d %d %d", A+i, B+i, C+i);



    for (p = 2; p <= 128; p++)

    {

        sgn = 0;

        for (t = p, i = 2; i <= p; i++)

        {

            if (t%i) continue;

            if (!((t/i)%i)) break;

            t /= i; sgn ^= 1;

        }

        if (i <= p) continue;



        for (i = 0; i < p && i <= 64; i++)

            for (j = 0; j < p && j <= 64; j++)

                for (k = 0; k < p && k <= 64; k++)

                    cnt[i][j][k] = 0;



        for (i = 0; i < N; i++)

            cnt[A[i]%p][B[i]%p][C[i]%p]++;



        for (i = 0; i < p && i <= 64; i++)

            for (a = i ? p-i : 0, j = 0; j < p && j <= 64; j++)

                for (b = j ? p-j : 0, k = 0; k < p && k <= 64; k++)

                {

                    c = k ? p-k : k;

                    if (a > 64 || b > 64 || c > 64) continue;

                    if (i == a && j == b && k == c)

                        Res += (sgn ? +1 : -1)*(ll)cnt[i][j][k]*(cnt[i][j][k]-1);

                    else

                        Res += (sgn ? +1 : -1)*(ll)cnt[i][j][k]*cnt[a][b][c];

                }

    }



    printf("%lld\n", Res/2);



    return 0;

}