Cod sursa(job #844874)

Utilizator stoicatheoFlirk Navok stoicatheo Data 29 decembrie 2012 21:39:23
Problema Puteri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>
#include <string.h>
 
#define maxx 70
#define ll double
#define maxn 100010
#define maxl 15
 
int n;
ll sol;
int a[maxn],b[maxn],c[maxn],diviz[maxx];
char r[maxx*2][maxx*2];
char v[maxl];
int p[maxx][maxx][maxx];
 
ll count(int x)
{
    int i,j,k;
    ll rez=0;
    int d[maxn],e[maxn],f[maxn];
    memset(p,0,sizeof(p));
     
    for (i=1;i<=n;i++)
    {
        d[i]=r[a[i]][x];
        e[i]=r[b[i]][x];
        f[i]=r[c[i]][x];
    }
     
    for (i=1;i<=n;++i) 
      if ((r[x-d[i]][x]<maxx) && (r[x-e[i]][x]<maxx) && (r[x-f[i]][x]<maxx)) p[d[i]][e[i]][f[i]]++;
     
    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+=(ll)+p[i][j][k]*(p[i][j][k]-1);
                else rez+=(ll)+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[d[i]][e[i]][f[i]]!=0)
            {
              if ((r[d[i]*2][x]==0) && (r[e[i]*2][x]==0) && (r[f[i]*2][x]==0)) rez+=(ll)+p[d[i]][e[i]][f[i]]*(p[d[i]][e[i]][f[i]]-1)/2;
              else rez+=(ll)+p[d[i]][e[i]][f[i]]*p[r[x-d[i]][x]][r[x-e[i]][x]][r[x-f[i]][x]];
              p[d[i]][e[i]][f[i]]=0;
            }
 
    return rez;
}
 
int divide(int x,int &rez)
{
    int i,l=0,aux;
    l=0;rez=0;
 
    for (i=1;i*i<=x;++i)
      if (x%i==0) diviz[++l]=i;
       
    if (diviz[l]*diviz[l]==x) aux=l-1;
    else aux=l;
     
    for (i=aux;i>0;i--) diviz[++l]=x/diviz[i];
     
    for (i=2;i<=l;++i)
      if (x%diviz[i]==0)
      {
             rez++;
             while (x%diviz[i]==0) x/=diviz[i];
      }
       
    return (1<<rez)==l;
}
 
 
int main()
{
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
     
    int i,y,j;
    ll x;
     
    for (i=1;i<maxx*2;i++)
      for (j=0;j<maxx*2;j++) r[j][i]=j%i;
     
    scanf("%d ",&n);
     
    for (i=1;i<=n;++i) 
    {
      fgets(v,maxl,stdin);
      for (j=0;v[j]!=' ';j++) a[i]=a[i]*10+v[j]-'0';
      j++;
      for (;v[j]!=' ';j++) b[i]=b[i]*10+v[j]-'0';
      j++;
      for (;v[j]!='\n';j++) c[i]=c[i]*10+v[j]-'0';
    }
         
    for (i=2;i<=128;++i)
     if (divide(i,y))
      {
            x=count(i);
            if (y%2==1) sol+=x;
            else sol-=x;
      }
 
     
    printf("%.0lf\n",sol);
     
    return 0;
}