Cod sursa(job #1695461)

Utilizator sucureiSucureiRobert sucurei Data 27 aprilie 2016 11:12:09
Problema Puteri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#define nmax 100010

int n, a[nmax], b[nmax], c[nmax], v[66][66][66], g[66];
long long sol;

int main()
{
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
    scanf("%d",&n);
    int i, k, ck, t, f, d, x, y, z;
    long long s;
    for (i=1; i<=n; i++)
        scanf("%d %d %d",&a[i],&b[i],&c[i]);
    for (k=2; k<=128; k++)
    {
        ck=k;
        t=0;
        for (d=2; d*d<=k; d++)
        {
            f=0;
            while (!(ck%d))
            {
                f++;
                ck/=d;
            }
            if (f>1)
            {
                t=-1;
                break;
            } else
                if (f==1) t++;
        }
        if (ck>1 && t>-1) t++;
        if (t>-1)
        {
            s=0;
            for (x=0; x<=64; x++)
                for (y=0; y<=64; y++)
                    for (z=0; z<=64; z++) v[x][y][z]=0;
            for (i=1; i<=64; i++) g[i]=i%k;
            for (i=1; i<=n; i++)
            {
                x=(k-g[a[i]]);
                if (x==k) x=0;
                y=(k-g[b[i]]);
                if (y==k) y=0;
                z=(k-g[c[i]]);
                if (z==k) z=0;
                if (x<=64 && y<=64 && z<=64)
                    s+=v[x][y][z];
                x=g[a[i]];
                y=g[b[i]];
                z=g[c[i]];
                v[x][y][z]++;
            }
            if (t%2) sol+=s; else sol-=s;
        }
    }
    printf("%lld\n",sol);
}