Cod sursa(job #27063)

Utilizator astronomyAirinei Adrian astronomy Data 6 martie 2007 01:05:09
Problema Puteri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>

#define MAXN (1 << 17)

typedef long long llong;
typedef unsigned char byte;

int N, R[66][66][66], nrd, prim[128], D[128], sgn[128];
byte A[MAXN], B[MAXN], C[MAXN];
byte rest[66][128];

llong res;

void preproc(void)
{
    int i, j, k, T = 0;

    for(i = 1; i <= 64; i++)
     for(j = 1; j < 128; j++)
        rest[i][j] = i%j;

    for(prim[++T] = 2, i = 3; i <= 128; i+=2)
    {
        for(j = 3; j < i; j++)
         if(i%j == 0)
            break ;
        if(j == i)
            prim[++T] = i;
    }

    for(i = 1; i <= T; i++)
        D[++nrd] = prim[i], sgn[nrd] = 1;

    for(i = 1; i <= T; i++)
     for(j = i+1; j <= T; j++)
      if(prim[i]*prim[j] <= 128)
        D[++nrd] = prim[i]*prim[j], sgn[nrd] = -1;

    for(i = 1; i <= T; i++)
     for(j = i+1; j <= T; j++)
      for(k = j+1; k <= T; k++)
        if(prim[i]*prim[j]*prim[k] <= 128)
            D[++nrd] = prim[i]*prim[j]*prim[k], sgn[nrd] = 1;
}

void baga(int ind)
{
    int i, j, k, r1, r2, r3, t, d, semn;

    d = D[ind], semn = sgn[ind];
    
    for(i = 1; i <= N; i++)
    {
        r1 = d-rest[A[i]][d], r2 = d-rest[B[i]][d];
        r3 = d-rest[C[i]][d];
        if(r1 == d) r1 = 0;
        if(r2 == d) r2 = 0;
        if(r3 == d) r3 = 0;
        if(r1 > 64 || r2 > 64 || r3 > 64)
            continue ;
        t = R[r1][r2][r3];
        if(semn == 1)
            res += (llong)t;
        else
            res -= (llong)t;
        R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ]++;
    }
    for(i = 1; i <= N; i++)
        R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ] = 0;
}

int main(void)
{
    freopen("puteri.in", "rt", stdin);
    freopen("puteri.out", "wt", stdout);

    int i;
    
    scanf("%d\n", &N);

    for(i = 1; i <= N; i++)
        scanf("%d %d %d\n", &A[i], &B[i], &C[i]);

    preproc();

    for(i = 1; i <= nrd; i++)
        baga(i);

    printf("%lld\n", res);

    return 0;
}