Cod sursa(job #1827342)

Utilizator silkMarin Dragos silk Data 11 decembrie 2016 19:07:22
Problema Puteri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
#define NMax 100000
#define VMax 128
#define FMax 64
#define ll long long

int ap[VMax+1][VMax+1][VMax+1];
int rest[4097][65];
int a[NMax+1];
int b[NMax+1];
int c[NMax+1];
ll v[VMax+1];

void Set(int v)
{
    int i,j,k;

    for(i = 0; i <= v; ++i)
        for(j = 0; j <= v; ++j)
            for(k = 0; k <= v; ++k) ap[i][j][k] = 0;
}

void Precalc()
{
    int i,j;
    for(i = 0; i <= 4096; ++i)
        for(j = 2; j <= 64; ++j)
        rest[i][j] = i%j;
}

bool prim(int x)
{
    for(int i = 2; i * i <= x; ++i)
    if( x % i == 0 ) return 0;
    return 1;
}

bool is_good(int x)
{
    int i,t;
    for(i = 2; i * i <= x; ++i)
    if( x % i == 0 )
    {
        t = 0;
        while( x%i == 0 ) ++t, x/=i;
        if(t>1) return 0;
    }
    return 1;
}

int f(int x)
{
    int i,nr=0;

    for(i = 2; i <= x; ++i)
    if( x % i == 0 && prim(i) ) ++nr;

    if(nr%2) return 1;
    return -1;
}

int main(){
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);

    int i,j,x,y,z,N;
    ll res;

    Precalc();

    scanf("%d",&N);
    for(i = 1; i <= N; ++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        a[i] = x;
        b[i] = y;
        c[i] = z;
    }

    for(i = 2; i <= FMax; ++i)
    if( is_good(i) )
    {
        for(j = 1; j <= N; ++j)
        ++ap[ rest[a[j]][i] ][ rest[b[j]][i] ][ rest[c[j]][i] ];

        for(j = 1; j <= N; ++j)
        {
            x = rest[(32*i-a[j])][i];
            y = rest[(32*i-b[j])][i];
            z = rest[(32*i-c[j])][i];

            v[i] = v[i] + ap[x][y][z];
            if( x==rest[a[j]][i] && y==rest[b[j]][i] && z==rest[c[j]][i] ) --v[i];
        }

        v[i] /= 2;
        Set(i-1);
    }

    Set(FMax);
    for(i = 1; i <= N; ++i) ++ap[ a[i] ][ b[i] ][ c[i] ];
    for(i = FMax+1; i <= VMax; ++i)
    if( is_good(i) )
    {
        for(j = 1; j <= N; ++j)
        {
            x = i-a[j];
            y = i-b[j];
            z = i-c[j];
            v[i] = v[i] + ap[x][y][z];
            if( x==a[j] && y==b[j] && z==c[j] ) --v[i];
        }
        v[i] /= 2;
    }

    for(res = 0, i = 2; i <= VMax; ++i) res += f(i)*v[i];
    printf("%lld\n",res);



return 0;
}