Cod sursa(job #1570285)

Utilizator felixiPuscasu Felix felixi Data 16 ianuarie 2016 12:27:13
Problema Puteri Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string.h>
#define Nmax 100002
#define Vmax 64+64+1
#define Rmax 65
#define LL long long

int a[Nmax],b[Nmax],c[Nmax];
int p[Vmax],prim[Vmax];
int r[Rmax][Rmax][Rmax],uzz[Rmax][Rmax][Rmax];
int N,z;
LL rez,nr;

inline int Minim(int x,int y){ return x<y ? x:y; }

void ciur(){
    int i,j;
    for(i=2;i<Vmax;++i)
        if( p[i]==0 ){
            prim[++z]=i;
            for(j=i; j<Vmax; j+=i)
                if( p[j]!=-1)
                    ++p[j];
            for(j=i*i; j<Vmax; j+=i*i)
                p[j]=-1;
        }
}

int main(){
    int i,j,i1,i2,j1,j2,k1,k2;
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
    scanf("%d",&N);
    for(i=1;i<=N;++i) scanf("%d%d%d",&a[i],&b[i],&c[i]);

    ciur();

    for(i=2;i<Vmax;++i)
    if( p[i] != -1 ){
        memset(r,0,sizeof(r));
        nr=0;

        for(j=1;j<=N;++j)
            ++r[a[j]%i][b[j]%i][c[j]%i];

        for(i1=0;i1<Minim(i,Rmax);++i1)
            for(i2=(i-i1)%i, j1=0;j1<Minim(i,Rmax);++j1)
                for(j2=(i-j1)%i, k1=0;k1<Minim(i,Rmax);++k1){
                    k2=(i-k1)%i;
                    if( i2<Rmax && j2<Rmax && k2<Rmax )
                        if( i1==i2 && j1==j2 && k1==k2 )
                            nr += 1LL*r[i1][j1][k1]*(r[i1][j1][k1]-1);
                        else nr += 1LL*r[i1][j1][k1]*r[i2][j2][k2];
                }
        if( p[i] & 1) rez += nr;
        else rez-=nr;
    }




    printf("%lld\n",rez/2);
    fclose(stdin); fclose(stdout);
    return 0;
}