Cod sursa(job #24263)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 1 martie 2007 23:15:00
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <string.h>
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define nmax 100111
#define pmax 128
#define kmax 65

typedef long long lint;

int H[pmax][pmax][pmax],n;
//int A[nmax],B[nmax],C[nmax];
int A[kmax][kmax][kmax];
int mod[pmax][pmax];
lint sol;

int main()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf("%d",&n);
	int i,j,a,b,c,p,g,aa,bb,cc;
	lint aux;
	FOR(i,0,n)
	{
		scanf("%d %d %d",&a,&b,&c);
		A[a][b][c]++;
//		A[i]=a,B[i]=b,C[i]=c;
	}
	FOR(a,0,pmax) FOR(b,1,pmax)
		mod[b][a]=a%b;
	FOR(p,2,129)
	{
		j=p;a=0;
		FOR(i,2,p+1)
		{
			if(j%i==0)
				j/=i,a++;
			if(j%i==0)
				break;
		}
		if(i!=p+1)
			continue;
		j=a&1;
		if(p<=65)
		{
			memset(H,0,sizeof(H));
			aa=0;
			FOR(a,0,65) 
			{
				if(aa==p)
					aa=0;
				bb=0;
				FOR(b,0,65) 
				{
					if(bb==p)
						bb=0;
					cc=0;
					FOR(c,0,65)
					{
						if(cc==p)
							cc=0;
						H[aa][bb][cc]+=A[a][b][c];
						cc++;
					}
					bb++;
				}
				aa++;
			}
		}
		aux=0;

		g=p>64?65:p;
	
			FOR(a,0,g) FOR(b,0,g) FOR(c,0,g)
			{
				if((a+a==p||!a)&&(b+b==p||!b)&&(c+c==p||!c))
					aux+=(lint)H[a][b][c]*(H[a][b][c]-1);
				else
					aux+=(lint)H[a][b][c]*H[a?p-a:0][b?p-b:0][c?p-c:0];
			}
		if(j)
			sol+=aux;
		else
			sol-=aux;		
	}
	printf("%lld\n",sol/2);
	return 0;
}