Pagini recente » Cod sursa (job #3189291) | Cod sursa (job #2578563) | Cod sursa (job #1214954) | Rating Mihai Bendeac (ONI2015) | Cod sursa (job #66913)
Cod sursa(job #66913)
using namespace std;
#define MAX_N 100005
#define MAX_P 70
#include <stdio.h>
#include <fstream>
FILE *fin=fopen("puteri.in","r"),
*fout=fopen("puteri.out","w");
typedef struct
{
short x,y,z;
} data;
int n,i;
int nr[MAX_P][MAX_P][MAX_P];
data q[MAX_N];
int a[MAX_P<<1];
int max(int a, int b, int c)
{
if (a<b) a=b;
if (c<a) c=a;
return c;
}
int paritate(int a)
{
int i,ct=0;
i=2;
if (a==1) return 1;
while (a>1)
{ if (a%i==0)
{
ct++;
while (a%i==0) a/=i;
}
i++;
}
return ct;
}
void solve(int &b, int p)
{
int i;
int r1,r2,r3;
int m;
memset(nr,0,sizeof(nr));
for (i=1; i<=n; i++)
nr[q[i].x%p][q[i].y%p][q[i].z%p]++;
for (r1=0; r1<=10; r1++)
for (r2=0; r2<=10; r2++)
for (r3=0; r3<=10; r3++)
{
m=max(r1,r2,r3);
for (i=m; i<=m+m+1; i++)
if (((r1<<1)%p==0)&&((r2<<1)%p==0)&&((r3<<1)%p==0))
{ b+=nr[r1][r2][r3]*(nr[r1][r2][r3]-1)/2; break; }
else
b+=nr[r1][r2][r3]*nr[(i-r1)%p][(i-r2)%p][(i-r3)%p]/2;
}
}
int main()
{
fscanf(fin,"%d",&n);
for (i=1; i<=n; i++)
fscanf(fin,"%d %d %d",&q[i].x,&q[i].y,&q[i].z);
for (i=2; i<=128; i++)
solve(a[i],i);
int sol=0;
for (i=1; i<=128; i++)
if (paritate(a[i])&1)
sol+=a[i]; else sol-=a[i];
fprintf(fout,"%d\n",sol);
return 0;
}