Cod sursa(job #25548)

Utilizator VmanDuta Vlad Vman Data 4 martie 2007 12:54:20
Problema Puteri Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasa a 9-a si gimnaziu Marime 1.23 kb
#include <stdio.h>
#include <string.h>
#define nmax 100000

long n,i,j;
int a[nmax],b[nmax],c[nmax],t[65];
long r[64][64][64];
long long nr;

void divizor(int d,int k)
{
int i,aa,bb,cc,aa1,bb1,cc1;
memset(r,0,sizeof(r));
for (i=0;i<n;++i)
    {
    aa=a[i]%d;
    bb=b[i]%d;
    cc=c[i]%d;
    if (aa==0) aa1=0;
       else aa1=d-aa;
    if (bb==0) bb1=0;
       else bb1=d-bb;
    if (cc==0) cc1=0;
       else cc1=d-cc;
    nr+=r[aa1][bb1][cc1]*k;
    ++r[aa][bb][cc];
    }
}

int main()
{
    freopen("puteri.in","r",stdin);
    scanf("%ld\n",&n);
    for (i=0;i<n;++i)
	scanf("%d %d %d\n",&a[i],&b[i],&c[i]);
    fclose(stdin);
    t[1]=2;
    t[2]=3;
    t[3]=5;
    t[4]=7;
    t[5]=11;
    t[6]=13;
    t[7]=17;
    t[8]=19;
    t[9]=23;
    t[10]=29;
    t[11]=31;
    t[12]=37;
    t[13]=41;
    t[14]=43;
    t[15]=47;
    t[16]=53;
    t[17]=59;
    t[18]=61;
    for (i=1;i<=18;++i)
	divizor(t[i],1);
    for (i=1;i<=18;++i)
	   for (j=i+1;j<=18;++j)
            if (t[i]*t[j]<=64)
               divizor(t[i]*t[j],-1);
               else break;
    divizor(30,1);
    divizor(42,1);
    freopen("puteri.out","w",stdout);
    printf("%lld",nr);
    fclose(stdout);
     return 0;
}