Pagini recente » Cod sursa (job #405176) | Cod sursa (job #3198076) | Cod sursa (job #2212449) | Cod sursa (job #1413554) | Cod sursa (job #27060)
Cod sursa(job #27060)
#include <stdio.h>
#include <time.h>
#define MAXN (1 << 17)
typedef long long llong;
typedef unsigned char byte;
int N, R[66][66][66], nrd, prim[128], D[128], sgn[128];
byte A[MAXN], B[MAXN], C[MAXN];
byte rest[66][128];
llong res;
void preproc(void)
{
int i, j, k, T = 0;
for(i = 1; i <= 64; i++)
for(j = 1; j < 128; j++)
rest[i][j] = i%j;
for(prim[++T] = 2, i = 3; i <= 128; i+=2)
{
for(j = 3; j < i; j++)
if(i%j == 0)
break ;
if(j == i)
prim[++T] = i;
}
for(i = 1; i <= T; i++)
D[++nrd] = prim[i], sgn[nrd] = 1;
for(i = 1; i <= T; i++)
for(j = i+1; j <= T; j++)
if(prim[i]*prim[j] <= 128)
D[++nrd] = prim[i]*prim[j], sgn[nrd] = -1;
for(i = 1; i <= T; i++)
for(j = i+1; j <= T; j++)
for(k = j+1; k <= T; k++)
if(prim[i]*prim[j]*prim[k] <= 128)
D[++nrd] = prim[i]*prim[j]*prim[k], sgn[nrd] = 1;
}
void baga(int ind)
{
int i, j, k, r1, r2, r3, t, d, semn;
d = D[ind], semn = sgn[ind];
for(i = 1; i <= N; i++)
{
r1 = d-rest[A[i]][d], r2 = d-rest[B[i]][d];
r3 = d-rest[C[i]][d];
if(r1 == d) r1 = 0;
if(r2 == d) r2 = 0;
if(r3 == d) r3 = 0;
if(r1 > 64 || r2 > 64 || r3 > 64)
continue ;
t = R[r1][r2][r3];
if(semn == 1)
res += (llong)t;
else
res -= (llong)t;
R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ]++;
}
for(i = 1; i <= N; i++)
R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ] = 0;
}
int main(void)
{
freopen("puteri.in", "rt", stdin);
freopen("puteri.out", "wt", stdout);
int i, x, y, z, ind;
char sir[1024];
int start, end;
start = clock();
scanf("%d\n", &N);
for(i = 1; i <= N; i++)
{
fgets(sir, 1024, stdin), x = y = z = ind = 0;
for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
x = x*10+(sir[ind]-48);
for(ind++; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
y = y*10+(sir[ind]-48);
for(ind++; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
z = z*10+(sir[ind]-48);
A[i] = x, B[i] = y, C[i] = z;
}
preproc();
for(i = 1; i <= nrd; i++)
baga(i);
printf("%lld\n", res);
end = clock();
fprintf(stderr, "%lf\n", (double)(end-start) / CLK_TCK);
return 0;
}