Cod sursa(job #28693)

Utilizator goguGogu Marian gogu Data 8 martie 2007 10:38:57
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>

int n;
unsigned short pos[70][70][70];

unsigned prod(int a, int b, int c, int a2, int b2, int c2)
{
         if (a!=a2 || b!=b2 || c!=c2) return pos[a][b][c]*pos[a2][b2][c2];
            else return pos[a][b][c]*(pos[a2][b2][c2]-1);
}

int main()
{
    freopen("puteri.in", "r", stdin);
    freopen("puteri.out", "w", stdout);
    scanf("%d", &n);
    int i,a,b,c;
    for (i=0; i<n; i++){
        scanf("%d %d %d", &a, &b, &c);
        pos[a][b][c]++;
    }
    long long sol=0;
    for (i=1; i<=128; i++){
        int last=i+1, p=0;
        if (last>65) last=65;
        while (i-p>64) p++;
        for (a=p; a<last; a++)
            for (b=p; b<last; b++)
                for (c=p; c<last; c++)
                    sol+=prod(a,b,c,i-a,i-b,i-c);
    }
    for (i=1; i<=128; i++)
    for (int mask=1; mask<7; mask++){
        int pa=65, pb=65, pc=65;
        int last=i+1;
        if (last>65) last=65;
        if (mask & 1) pa=1;
        if (mask & 2) pb=1;
        if (mask & 4) pc=1;
        for (a=0; a<last; a+=pa)
            if (i-a<65)
            for (b=0; b<last; b+=pb)
                if (i-b<65)
                for (c=0; c<last; c+=pc)
                    if (i-c<65){
                       int a2=i-a, b2=i-b, c2=i-c;
                       if (pa>1) a2=0;
                       if (pb>1) b2=0;
                       if (pc>1) c2=0;                       
                       long long old=sol;
                       sol+=prod(a, b, c, a2, b2, c2);
                    }
    }
    printf("%lld\n", sol/2);
    return 0;    
}