Cod sursa(job #26976)

Utilizator astronomyAirinei Adrian astronomy Data 5 martie 2007 23:04:34
Problema Puteri Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <stdio.h>

#define MAXN (1 << 17)

typedef long long llong;
typedef unsigned char byte;

int N, R[66][129][129], D[8], sgn[8], NRD;

byte A[MAXN], B[MAXN], C[MAXN];

byte rest[66][129];

llong res;

void baga(int V)
{
    int i, j, k, t, d, r1, r2, aux, r, a2, semn;

    for(NRD = 0, aux = V, i = 2; i <= aux; i++)
     if(aux%i == 0)
     {
        D[++NRD] = i, sgn[NRD] = 1;
        while(aux%i == 0)
            aux /= i;
     }

    if(NRD == 2)
        D[++NRD] = D[1]*D[2], sgn[NRD] = -1;
    else
        if(NRD == 3)
            D[++NRD] = D[1]*D[2], sgn[NRD] = -1, D[++NRD] = D[1]*D[3],
            sgn[NRD] = -1, D[++NRD] = D[2]*D[3], sgn[NRD] = -1,
            D[++NRD] = D[1]*D[2]*D[3], sgn[NRD] = 1;

            
    for(j = 1; j <= NRD; j++)
    {
        d = D[j], semn = sgn[j];
        for(i = 1; i <= N; i++)
        {
            r1 = d-rest[B[i]][d], r2 = d-rest[C[i]][d];
            if(r1 == d) r1 = 0;
            if(r2 == d) r2 = 0;
            if((a2 = V-A[i]) >= 0 && a2 <= 64)
            {
                t = R[a2][r1][r2];
                if(semn == 1)
                    res += (llong)t;
                else
                    res -= (llong)t;
            }
            R[A[i]][rest[B[i]][d]][rest[C[i]][d]]++;
        }
        for(i = 1; i <= N; i++)
        {
            r1 = rest[B[i]][d], r2 = rest[C[i]][d];
            R[A[i]][r1][r2] = 0;
        }
    }
}

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

    int i, j, k, v, ind;

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

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

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

    for(v = 2; v <= 128; v++)
        baga(v);

    for(ind = 0, i = 1; i <= N; i++)
     if(A[i] == 0)
        A[++ind] = B[i], B[ind] = C[i], C[ind] = 0;

    N = ind;
    for(v = 2; v <= 128; v++)
        baga(v);

    for(ind = 0, i = 1; i <= N; i++)
     if(A[i] == 0)
        A[++ind] = B[i];

    N = ind;
    for(i = 1; i <= N; i++)
        res += (llong)(i-1);

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

    return 0;
}