Pagini recente » Cod sursa (job #2889623) | Cod sursa (job #1837497) | Cod sursa (job #558412) | Cod sursa (job #949247) | Cod sursa (job #1333639)
#include <cstdio>
#include <vector>
#define MOD 131071
#define Nmax 100005
using namespace std;
struct triplet
{
int a,b,c,cnt;
bool operator == (const triplet A) const
{
return (a==A.a && b==A.b && c==A.c);
}
} v[Nmax],aux[Nmax];
vector <triplet> H[MOD];
int ciur[130],n;
inline void AH(triplet w)
{
int key=((100*w.a+10*w.b+w.c)&MOD);
vector <triplet> ::iterator it;
for(it=H[key].begin();it!=H[key].end();++it)
if(*it==w)
{
it->cnt++; return;
}
w.cnt=1;
H[key].push_back(w);
}
inline void Delete(triplet w)
{
int key=((100*w.a+10*w.b+w.c)&MOD);
vector <triplet> ::iterator it;
for(it=H[key].begin();it!=H[key].end();++it)
if(*it==w)
{
H[key].erase(it); return;
}
}
inline int SH(triplet w)
{
int key=((100*w.a+10*w.b+w.c)&MOD);
vector <triplet> ::iterator it;
for(it=H[key].begin();it!=H[key].end();++it)
if(*it==w) return it->cnt;
return 0;
}
inline long long Count(int p)
{
triplet w;
int i;
long long sol=0;
for(i=1;i<=n;++i)
{
if(p>64) w=v[i];
else
{
w.a=v[i].a%p; w.b=v[i].b%p; w.c=v[i].c%p;
}
AH(w);
aux[i]=w;
}
for(i=1;i<=n;++i)
{
w.a=p-aux[i].a; w.b=p-aux[i].b; w.c=p-aux[i].c;
if(w.a==p) w.a=0; if(w.b==p) w.b=0; if(w.c==p) w.c=0;
sol+=SH(w);
if(w==aux[i]) --sol;
}
for(i=1;i<=n;++i) Delete(aux[i]);
return (sol>>1);
}
int main()
{
long long ans=0;
int i,j;
freopen ("puteri.in","r",stdin);
freopen ("puteri.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;++i) scanf("%d%d%d", &v[i].a,&v[i].b,&v[i].c);
for(i=2;i<=128;++i)
if(!ciur[i])
{
for(j=i*2;j<=128;j+=i) ++ciur[j];
ans+=Count(i);
}
else
{
for(j=i*2;j<=128;j+=i) ciur[j]-=(ciur[i]-1);
if(ciur[i]>1)
ans-=Count(i)*(ciur[i]-1);
}
printf("%lld\n", ans);
return 0;
}