Pagini recente » Cod sursa (job #430487) | Cod sursa (job #407756) | Cod sursa (job #2244442) | Cod sursa (job #598821) | Cod sursa (job #32461)
Cod sursa(job #32461)
#include <stdio.h>
#include <string>
#define maxx 129
#define ll long long
#define maxn 100010
#define maxl 15
#define lim1 50
int n;
ll sol;
char a[maxn],b[maxn],c[maxn],diviz[maxx];
char r[maxx][maxx];
char v[maxl];
char p[maxx][maxx][maxx];
int p2[lim1][lim1][lim1];
int count(int x)
{
int i,j,k,rez=0;
char d[maxn],e[maxn],f[maxn];
memset(p,0,sizeof(p));
for (i=1;i<=n;i++)
{
d[i]=r[a[i]][x];
e[i]=r[b[i]][x];
f[i]=r[c[i]][x];
}
for (i=1;i<=n;++i) p[d[i]][e[i]][f[i]]++;
if (x*x*x<n)
{
for (i=0;i<x;i++)
for (j=0;j<x;j++)
for (k=0;k<x;k++)
if (p[i][j][k]!=0)
if ((r[i*2][x]==0) && (r[j*2][x]==0) && (r[k*2][x]==0)) rez+=p[i][j][k]*(p[i][j][k]-1);
else rez+=p[i][j][k]*p[r[x-i][x]][r[x-j][x]][r[x-k][x]];
rez=rez/2;
}
else for (i=1;i<=n;i++)
if (p[d[i]][e[i]][f[i]]!=0)
{
if ((r[d[i]*2][x]==0) && (r[e[i]*2][x]==0) && (r[f[i]*2][x]==0)) rez+=p[d[i]][e[i]][f[i]]*(p[d[i]][e[i]][f[i]]-1)/2;
else rez+=p[d[i]][e[i]][f[i]]*p[r[x-d[i]][x]][r[x-e[i]][x]][r[x-f[i]][x]];
p[d[i]][e[i]][f[i]]=0;
}
return rez;
}
int count2(int x)
{
int i,j,k,rez=0;
char d[maxn],e[maxn],f[maxn];
memset(p2,0,sizeof(p2));
for (i=1;i<=n;i++)
{
d[i]=r[a[i]][x];
e[i]=r[b[i]][x];
f[i]=r[c[i]][x];
}
for (i=1;i<=n;++i) p2[d[i]][e[i]][f[i]]++;
if (x*x*x<n)
{
for (i=0;i<x;i++)
for (j=0;j<x;j++)
for (k=0;k<x;k++)
if (p2[i][j][k]!=0)
if ((r[i*2][x]==0) && (r[j*2][x]==0) && (r[k*2][x]==0)) rez+=p2[i][j][k]*(p2[i][j][k]-1);
else rez+=p2[i][j][k]*p2[r[x-i][x]][r[x-j][x]][r[x-k][x]];
rez=rez/2;
}
else for (i=1;i<=n;i++)
if (p2[d[i]][e[i]][f[i]]!=0)
{
if ((r[d[i]*2][x]==0) && (r[e[i]*2][x]==0) && (r[f[i]*2][x]==0)) rez+=p2[d[i]][e[i]][f[i]]*(p2[d[i]][e[i]][f[i]]-1)/2;
else rez+=p2[d[i]][e[i]][f[i]]*p2[r[x-d[i]][x]][r[x-e[i]][x]][r[x-f[i]][x]];
p2[d[i]][e[i]][f[i]]=0;
}
return rez;
}
int divide(int x,int &rez)
{
int i,l=0,aux;
l=0;rez=0;
for (i=1;i*i<=x;++i)
if (x%i==0) diviz[++l]=i;
if (diviz[l]*diviz[l]==x) aux=l-1;
else aux=l;
for (i=aux;i>0;i--) diviz[++l]=x/diviz[i];
for (i=2;i<=l;++i)
if (x%diviz[i]==0)
{
rez++;
while (x%diviz[i]==0) x/=diviz[i];
}
return (1<<rez)==l;
}
int main()
{
freopen("puteri.in","r",stdin);
freopen("puteri.out","w",stdout);
int i,x,y,j;
for (i=1;i<maxx;i++)
for (j=0;j<maxx;j++) r[j][i]=j%i;
scanf("%d ",&n);
// for (;n>65534;);
for (i=1;i<=n;++i)
{
fgets(v,maxl,stdin);
for (j=0;v[j]!=' ';j++) a[i]=a[i]*10+v[j]-'0';
j++;
for (;v[j]!=' ';j++) b[i]=b[i]*10+v[j]-'0';
j++;
for (;v[j]!='\n';j++) c[i]=c[i]*10+v[j]-'0';
}
for (i=2;i<lim1;++i)
if (divide(i,y))
{
x=count2(i);
// if (x>0) printf("%d %d\n",i,x);
if (y%2==1) sol+=x;
else sol-=x;
}
for (i=lim1;i<maxx;++i)
if (divide(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;
}