Cod sursa(job #209242)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 21 septembrie 2008 15:37:03
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<stdio.h>
#define P 128
#define N 100001
int n,i,x[N],y[N],z[N],p[P],np,s[P],j,k,a[P][P][P];
void readd(),solve(),semne();
int numar();
int main()
{       readd();
	solve();
	return 0;
}
void readd()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d%d%d",&x[i],&y[i],&z[i]);
}
void semne()
{       for(i=2;i<=128;i++)
	 if(!p[i])
	 for(j=i+i;j<=128;j+=i)
	  p[j]=1;
	for(i=2;i<=128;i++)
	 if(!p[i])p[++np]=i;
	for(i=1;i<=np;i++)s[i]=1;
	for(i=1;i<=np-1;i++)
	{ if(p[i]*p[i+1]>128)break;
	  for(j=i+1;j<=np;j++)
	  { if(p[i]*p[j]>128)break;
	    s[p[i]*p[j]]=-1;
	  }
	}
	for(i=1;i<=np-2;i++)
	{ if(p[i]*p[i+1]*p[i+2]>128)break;
	  for(j=i+1;j<=np-1;j++)
	  { if(p[i]*p[j]*p[j+1]>128)break;
	    for(k=j+1;k<=np;k++)
	    { if(p[i]*p[j]*p[k]>128)break;
	      s[p[i]*p[j]*p[k]]=1;
	    }
	  }
	}
}
void solve()
{    int cate,sol;
     semne();
     sol=0;
     for(k=0;k<128;k++)
      if(s[k])
       { cate=numar();
	 sol=sol+s[k]*cate;
       }
      printf("%d",sol);
}
int numar()
{       int mm[P],op[P],r1,r2,r3,q1,q2,q3,ret;
	for(i=0;i<128;i++)mm[i]=i%k;
	for(i=1;i<k;i++)op[i]=k-i;
	for(i=1;i<=n;i++)
	{ r1=mm[x[i]];r2=mm[y[i]];r3=mm[z[i]];
	  a[r1][r2][r3]++;
	}
	ret=0;
	for(r1=0;;r1++)
	{ if(r1>op[r1])break;
	  if(r1<op[r1])
	  { q1=op[r1];
	    for(r2=0;r2<k;r2++)
	     { q2=op[r2];
	       for(r3=0;r3<k;r3++)
	       { q3=op[r3];
		 ret+=a[r1][r2][r3]*a[q1][q2][q2];
		 a[r1][r2][r3]=a[q1][q2][q3]=0;
	       }
	     }
	  }
	  else
	  for(r2=0;;r2++)
	  { if(r2>op[r2])break;
	    if(r2<op[r2])
	    { q2=op[r2];
	      for(r3=0;r3<k;r3++)
	      { q3=op[q3];
		ret+=a[r1][r2][r3]*a[r1][q2][q3];
	      }
	    }
	    else
	    for(r3=0;;r3++)
	    { if(r3>op[r3])break;
	      if(r3<op[r3])
	      ret+=a[r1][r2][r3]*a[r1][r2][op[r3]];
	      else
	      { q1=a[r1][r2][r3];
		q1*=q1-1;
		q1/=2;
		ret+=q1;
	      }
	    }
	  }
	}
	return ret;
}