Cod sursa(job #218172)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 1 noiembrie 2008 00:27:03
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
using namespace std;
#include<fstream>
int N,nr[129][129][129],v[100005][3],ciur[129];
long long final;
void ciuruire()// va arata ce numere sunt prime sau produse de factori primi;
{
	int i,j,k;
	for(i=1;i<=128;++i)
		ciur[i]=0;
	for(i=2;i<=128;++i)
		if(ciur[i]==0) //numarul este prim;
		{	
			for(j=i;j<=128;j+=i)
				if(ciur[j]!=-1)
					ciur[j]++;
			k=i*i;	
			for(j=k;j<=128;j+=k)
				ciur[j]=-1;//are divizor patratul unui numar prim;
		}
}
void citire()
{
	int i;
	ifstream in("puteri.in");
	in>>N;
	for(i=1;i<=N;++i)
		in>>v[i][0]>>v[i][1]>>v[i][2];
	in.close();
}

long long suma( long long i)
{
	long long j1,s=0,j2,j3;
	for(j1=0;j1<=i/2;++j1)
		for(j2=0;j2<=i/2;++j2)
			for(j3=0;j3<=i/2;++j3)
				if(!((2*j1)||(2*j2)||(2&j3)))
					s+=(long long)nr[j1][j2][j3]*(long long)(nr[j1][j2][j3]-1)/2;
				else
					s+=(long long)nr[j1][j2][j3]*(long long)nr[i-j1][i-j2][i-j3];
	return s;
}
	
void calcul()
{
	int i,j;
	ciuruire();
	for(i=1;i<=N;++i)
		for(j=2;j<=v[i][0]+1 || j<=v[i][1]+1 || j<=v[i][2]+1;j++)
			if (ciur[j]>0)
				nr[v[i][0]%j][v[i][1]%j][v[i][2]%j]++;
	final=0;
	for(i=2;i<=128;++i)
	{
		if(ciur[i]>0)
			if(ciur[i]&1)
				final+=suma((long long)i);
			else
				final-=suma((long long)i);
	}

}


int main()
{
	ofstream out("puteri.out");
	citire();
	calcul();
	out<<final<<'\n';
	out.close();
	return 0;
}