Cod sursa(job #844877)

Utilizator stoicatheoFlirk Navok stoicatheo Data 29 decembrie 2012 21:42:25
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>
#include <string.h>
 
#define FOR(i,a,b) for (int (i) = (a); i < (int)(b); i++)
 
long long NR;
int nr[65][65][65];
int nrp[65][65][65];
int prim[130];
 
int isprime( int k )
{
    if (k == 2)
        return 1;
    if (k % 2 == 0)
        return 0;
    int i;
    for (i = 3; i * i <= k; i += 2)
        if (k % i == 0)
            return 0;
    return 1;
}
 
inline int min( int a, int b )
{
    return (a < b) ? a : b;
}
 
int st[130];
void back( int k, int K, int P, int type )
{
    if (P > 128)
        return;
    if (k == K)
    {
        memset(nrp, 0, sizeof(nrp));
        FOR(a,0,65) FOR(b,0,65) FOR(c,0,65)
            nrp[a % P][b % P][c % P] += nr[a][b][c];
        long long NR2 = 0;
        FOR(a, 0, min(65, P) ) FOR(b, 0, min(65, P) ) FOR(c, 0, min(65, P) )
        {
            int a2, b2, c2;
            a2 = (P - a) % P; b2 = (P - b) % P; c2 = (P - c) % P;
            if (a2 > 64 || b2 > 64 || c2 > 64)
                continue;
         
            NR += type * (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
            NR2 += (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
        }
        return;
    }
    int i = 1;
    if (k > 0) i = st[k - 1] + 1;
    for (; i <= prim[0]; i++)
        st[k] = i,
        back( k + 1, K, P * prim[i], type);
}
 
int main()
{
    freopen("puteri.in", "rt", stdin);
    freopen("puteri.out", "wt", stdout);
    int N;
    scanf("%d", &N);
 
    FOR(i,0,N)
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
 
        nr[a][b][c]++;
    }
 
    FOR(i,2,130)
        if (isprime( i ))
            prim[++prim[0]] = i;
 
    int P = 1;
    FOR(i,1,prim[0] + 1)
    {
        P *= prim[i];
        if (P > 128)
            break;
        if (i & 1)
            back(0, i, 1, 1);
        else
            back(0, i, 1, -1);
    }
    printf("%lld\n", NR >> 1);
 
    return 0;
}