Pagini recente » Cod sursa (job #401253) | Cod sursa (job #32318)
Cod sursa(job #32318)
#include <stdio.h>
#include <string.h>
#define maxx 128
#define ll long long
#define maxn 100010
int n;
ll sol;
int p[maxx][maxx][maxx];
char u[maxx][maxx][maxx];
int a[maxn],b[maxn],c[maxn],d[maxx];
int count(int x)
{
int i,j,k,rez=0;
memset(p,0,sizeof(p));
memset(u,0,sizeof(u));
char d[maxn],e[maxn],f[maxn];
for (i=1;i<=n;i++)
{
d[i]=a[i]%x;
e[i]=b[i]%x;
f[i]=c[i]%x;
}
for (i=1;i<=n;++i) p[d[i]][e[i]][f[i]]++;
for (i=1;i<=n;i++)
if (u[d[i]][e[i]][f[i]]==0)
{
if (((d[i]*2)%x==0) && ((e[i]*2)%x==0) && ((f[i]*2)%x==0)) rez+=p[d[i]][e[i]][f[i]]*(p[d[i]][e[i]][f[i]]-1);
else rez+=p[d[i]][e[i]][f[i]]*p[(x-d[i])%x][(x-e[i])%x][(x-f[i])%x];
u[d[i]][e[i]][f[i]]=1;
}
return rez/2;
}
int diviz(int x,int &rez)
{
int i,l=0,aux;
l=0;rez=0;
for (i=1;i*i<=x;++i)
if (x%i==0) d[++l]=i;
if (d[l]*d[l]==x) aux=l-1;
else aux=l;
for (i=aux;i>0;i--) d[++l]=x/d[i];
for (i=2;i<=l;++i)
if (x%d[i]==0)
{
rez++;
while (x%d[i]==0) x/=d[i];
}
return (1<<rez)==l;
}
int main()
{
freopen("puteri.in","r",stdin);
freopen("puteri.out","w",stdout);
int i,x,y;
scanf("%d ",&n);
for (i=1;i<=n;++i) scanf("%d %d %d ",&a[i],&b[i],&c[i]);
for (i=2;i<=maxx;++i)
if (diviz(i,y))
{
x=count(i);
// if (x>0) printf("%d %d\n",i,x);
if (y%2==1) sol+=x;
else sol-=x;
}
printf("%lld\n",sol);
return 0;
}