Cod sursa(job #214834)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 16 octombrie 2008 13:09:50
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <vector>
using namespace std;
const int n_max = 2000020;
vector <bool> m(n_max,false);
char nr[n_max];
int b[100001][3];
long long sol, n, maxim = 128;
void read()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf(" %lld", &n);
0	
	long long t;
	for (int i = 1; i <= n; ++ i)
	{
		scanf("%d %d %d", &b[i][0], &b[i][1], &b[i][2]);
		
	}
}

inline long long combinari(long long x)
{
	return (long long)x*(x-1)/2;
}

long long kfc (int x) //A long time ago in a far away galaxy
{					  //There was a chicken ...
	int a[128][128][128];
	long long sol = 0;
	for (int i = 1; i <= n; ++ i)
		++a[b[i][0]%x][b[i][1]%x][b[i][2]%x]; // Here we fill the matrix with eggs from our chicken
	for (int i = 1; i <= x; ++ i)
		for (int j =1; j<= x; ++ j)
			for (int k = 1; k <= x; ++ k)
				sol+=a[i][j][k]*a[x-i][x-j][x-k];
	sol/=2; // And here the big guy smashes the idiot chicken!!!
	return sol;
}

void solve()
{
	long long i, j;
	for (i = 2; i<= maxim; ++i)
	{
		int v = 0;
		if (nr[i] == -1)
			continue;
		if (nr[i] == 0)
			for (j = i; j <= maxim; j+=i)
			{
				if (nr[j] != -1)
					++nr[j];
			}
		long long k = i*i;
		if (2*k <= 128)
			for (j = k; j <= maxim; j+=k)
				nr[j] = -1;
		else 
			if(k<=128)
				nr[k] = -1;
		if (nr[i]%2 == 0)
			sol+=kfc(i);
		else
			sol-=kfc(i);
		/*fprintf(stderr,"DEBUG: PT I=%lld MERGE!!J =%lld\n", i, j);
		fflush(stdout);*/
	}
}

void print()
{
	printf("%lld\n", sol);
}

void test() // THe sound barrier breaking function
{
	while (1)
		;
}

int main()
{
	
//	read();
	sol = combinari(n);
	solve();
	print();
	return 0;
}