Cod sursa(job #524694)

Utilizator DraStiKDragos Oprica DraStiK Data 22 ianuarie 2011 16:55:32
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <algorithm>
using namespace std;

#define DIM 100005
#define sc second
#define fs first
#define LIM 130
#define MAX 70

pair <pair <int,int>,int> v[DIM];
int viz[LIM],nrd[LIM];
int f[MAX][MAX][MAX];
long long nrt;
int n;

void read ()
{
    int i;

    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
        scanf ("%d%d%d",&v[i].fs.fs,&v[i].fs.sc,&v[i].sc);
}

void solve ()
{
    pair <pair <int,int>,int> cur;
    long long cnt;
    int i,j;

    for (i=2; i<LIM; ++i)
    {
        for (j=i*i; j<LIM; j+=i*i)
            viz[j]=1;
        if (!nrd[i])
            for (j=i; j<LIM; j+=i)
                ++nrd[j];
    }
    for (i=2; i<LIM; ++i)
        if (!viz[i])
        {
            cnt=0;
            memset (f,0,sizeof (f));

            for (j=1; j<=n; ++j)
            {
                cur.fs.fs=v[j].fs.fs%i;
                if (!cur.fs.fs)
                    cur.fs.fs=i;
                cur.fs.sc=v[j].fs.sc%i;
                if (!cur.fs.sc)
                    cur.fs.sc=i;
                cur.sc=v[j].sc%i;
                if (!cur.sc)
                    cur.sc=i;
                if (i-cur.fs.fs<65 && i-cur.fs.sc<65 && i-cur.sc<65)
                    cnt+=f[i-cur.fs.fs][i-cur.fs.sc][i-cur.sc];
                if (cur.fs.fs==i)
                    cur.fs.fs=0;
                cur.fs.sc=v[j].fs.sc%i;
                if (cur.fs.sc==i)
                    cur.fs.sc=0;
                cur.sc=v[j].sc%i;
                if (cur.sc==i)
                    cur.sc=0;
                ++f[cur.fs.fs][cur.fs.sc][cur.sc];
            }
            if (nrd[i]&1)
                nrt+=cnt;
            else
                nrt-=cnt;
        }

    printf ("%lld\n",nrt);
}

int main ()
{
    freopen ("puteri.in","r",stdin);
    freopen ("puteri.out","w",stdout);

    read ();
    solve ();

    return 0;
}