Cod sursa(job #519953)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 6 ianuarie 2011 23:06:35
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define ll long long
#define pii pair < pair < int , int > , int>
#define x first.first
#define y first.second
#define z second

pii q[100006];
int f[72][72][72],n;
int nrd[134],viz[134];
ll sol,s;

int main ()
{
    int i,j,p,r1,r2,r3;
    freopen("puteri.in","r",stdin);
    freopen("puteri.out","w",stdout);
    
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
        
    for(i=2;i<=128;i++)
    {
        for(j=i*i;j<=128;j+=i*i)
            viz[j]=1;
        if(!nrd[i])
            for(j=i;j<=128;j+=i)
                nrd[j]++;
    }

    for(p=2;p<=128;p++)
        if(!viz[p])
        {
            sol=0;
            memset(f,0,sizeof(f));
            for(i=1;i<=n;i++)
            {
                r1=q[i].x%p;
                r2=q[i].y%p;
                r3=q[i].z%p;
                if(!r1) r1=p;
                if(!r2) r2=p;
                if(!r3) r3=p;
                
                if(p-r1<65 && p-r2<65 && p-r3<65)
                    sol+=f[p-r1][p-r2][p-r3];
                    
                if(r1==p) r1=0;
                if(r2==p) r2=0;
                if(r3==p) r3=0;
                f[r1][r2][r3]++;
            }
            if(nrd[p]&1)
                s+=sol;
            else
                s-=sol;
        }
    printf("%lld\n",s);
    return 0;
}