Cod sursa(job #32339)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 17 martie 2007 18:52:06
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <string.h>

#define maxx 129
#define ll long long
#define maxn 100010

int n;
ll sol;
int p[maxx][maxx][maxx];
char a[maxn],b[maxn],c[maxn],div[maxx];
char r[maxx][maxx];

int count(int x)
{
    int i,j,k,rez=0;
	memset(p,0,sizeof(p));
    
	for (i=1;i<=n;++i) p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]++;
	
	if (x*x*x<n)
	{
        for (i=0;i<x;i++)
          for (j=0;j<x;j++)
            for (k=0;k<x;k++) 
              if (p[i][j][k]!=0)
                if ((r[i*2][x]==0) && (r[j*2][x]==0) && (r[k*2][x]==0)) rez+=p[i][j][k]*(p[i][j][k]-1);
                else rez+=p[i][j][k]*p[r[x-i][x]][r[x-j][x]][r[x-k][x]];
              
        rez=rez/2;
    }
    else for (i=1;i<=n;i++)
        	if (p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]!=0)
        	{
        	  if ((r[r[a[i]][x]*2][x]==0) && (r[r[b[i]][x]*2][x]==0) && (r[r[c[i]][x]*2][x]==0)) rez+=p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]*(p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]-1)/2;
        	  else rez+=p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]*p[r[x-r[a[i]][x]][x]][r[x-r[b[i]][x]][x]][r[x-r[c[i]][x]][x]];
        	  p[r[a[i]][x]][r[b[i]][x]][r[c[i]][x]]=0;
        	}

	return rez;
}

int diviz(int x,int &rez)
{
	int i,l=0,aux;
	l=0;rez=0;

	for (i=1;i*i<=x;++i)
      if (x%i==0) div[++l]=i;
      
    if (div[l]*div[l]==x) aux=l-1;
    else aux=l;
    
    for (i=aux;i>0;i--) div[++l]=x/div[i];
    
    for (i=2;i<=l;++i)
      if (x%div[i]==0)
      {
             rez++;
             while (x%div[i]==0) x/=div[i];
      }
      
    return (1<<rez)==l;
}

int main()
{
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
    
    int i,x,y,j;
    
    for (i=1;i<maxx;i++) 
      for (j=0;j<maxx;j++) r[j][i]=j%i;
    
    scanf("%d ",&n);
    for (i=1;i<=n;++i) scanf("%d %d %d ",&a[i],&b[i],&c[i]);
    
    for (i=2;i<maxx;++i)
     if (diviz(i,y))
      {
            x=count(i);
//            if (x>0) printf("%d %d\n",i,x);
            if (y%2==1) sol+=x;
            else sol-=x;
      }
    
    printf("%lld\n",sol);
    
    return 0;
}