Cod sursa(job #27385)

Utilizator pocaituDavid si Goliat pocaitu Data 6 martie 2007 13:12:01
Problema Puteri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
#include<math.h>
#include<fstream.h>
#define nm 130
#define nmax 100005
#define fin "puteri.in"
#define fout "puteri.out"
unsigned int nr[nm][nm][nm],a[nmax],b[nmax],c[nmax];
int long n;
long long sol;
void rezolva()
{int long d,i1,k,p;
 int ad,bd,cd,i;
 for(i=2;i<=nm-2;i++)
   {i1=i;
   for(d=2,k=0,p=1;d<=sqrt(i1);d++)
	if(!(i1%d))
	  {i1/=d;
	   if(!(i1%d))
		 {p=0;
		  break;
		  }
	   k++;
	   }
   if(i1>1)
	 k++;
   if(p)
	{//aflu restul impartirii la i
	 //memset(nr,0,sizeof(nr));
	 if(k%2)
	 for(d=1;d<=n;d++)
	   {sol+=nr[(i-a[d]%i)%i][(i-b[d]%i)%i][(i-c[d]%i)%i];
		nr[a[d]%i][b[d]%i][c[d]%i]++;
		}
	 else
	  for(d=1;d<=n;d++)
	   {sol-=nr[(i-a[d]%i)%i][(i-b[d]%i)%i][(i-c[d]%i)%i];
		nr[a[d]%i][b[d]%i][c[d]%i]++;
		}
	 for(d=1;d<=n;d++)
		nr[a[d]%i][b[d]%i][c[d]%i]=0;



	  }
   }


}










int main()
{int long i,j,k;
 char d[12];
 freopen(fin,"r",stdin);
 scanf("%ld",&n);
 fgets(d,11,stdin);
 for(i=1;i<=n;i++)
  {//scanf("%u%u%u",&a[i],&b[i],&c[i]);
   fgets(d,12,stdin);
   j=0;
   while(d[j]<='9'&&d[j]>='0')
	a[i]=a[i]*10+d[j++]-'0';
   j++;
   while(d[j]<='9'&&d[j]>='0')
	b[i]=b[i]*10+d[j++]-'0';
   j++;
   while(d[j]<='9'&&d[j]>='0')
	c[i]=c[i]*10+d[j++]-'0';
   }

 rezolva();
 freopen(fout,"w",stdout);
 printf("%lld",sol);
 fclose(stdout);
 return 0;
 }