Cod sursa(job #732930)

Utilizator danalex97Dan H Alexandru danalex97 Data 11 aprilie 2012 11:17:30
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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[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]++;
	}
	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;
}