Cod sursa(job #34181)

Utilizator dominoMircea Pasoi domino Data 20 martie 2007 12:28:25
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 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;
}