Cod sursa(job #2008115)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 5 august 2017 13:40:33
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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;
}