Cod sursa(job #1891070)

Utilizator Athena99Anghel Anca Athena99 Data 23 februarie 2017 18:40:44
Problema Puteri Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <string>

using namespace std;

ifstream fin("puteri.in");
ofstream fout("puteri.out");

typedef long long i64;

const int nmax= 100000;
const int nrmax= 128;
const int pmax= 64;

bool p[nrmax+1];
int a[nmax+1], b[nmax+1], c[nmax+1], v[nrmax+1], d[pmax+1][pmax+1][pmax+1][2], sign[nrmax+1];

string buffer;
string::iterator buffer_it;

void read_int_nn( int &x ) {
    for ( ; *buffer_it>'9' || *buffer_it<'0'; ++buffer_it ) ;
    for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; ++buffer_it ) {
        x= x*10+*buffer_it-'0';
    }
}

int main(  ) {
    getline( fin, buffer, (char)0 );
    buffer_it= buffer.begin();

    int n;
    read_int_nn(n);
    for ( int i= 1; i<=n; ++i ) {
        read_int_nn(a[i]), read_int_nn(b[i]), read_int_nn(c[i]);
    }

    i64 sol= 0;
    for ( int i= 2; i<=nrmax; ++i ) {
        sign[i]= -1;
    }
    for ( int i= 2; i<=nrmax; ++i ) {
        if ( p[i]==0 ) {
            for ( int j= i; j<=nrmax; j+= i ) {
                sign[j]*= -1;
            }
            for ( int j= i*i; j<=nrmax; j+= i*i ) {
                sign[j]= 0;
            }

            for ( int j= i*i; j<=nrmax; j+= i ) {
                p[j]= 1;
            }
        }

        if ( sign[i]!=0 ) {
            i64 ans= 0;
            for ( int j= 0; j<=nrmax; ++j ) {
                v[j]= j%i;
            }
            for ( int j= 1; j<=n; ++j ) {
                if ( v[i-v[a[j]]]<=pmax && v[i-v[b[j]]]<=pmax && v[i-v[c[j]]]<=pmax && d[v[i-v[a[j]]]][v[i-v[b[j]]]][v[i-v[c[j]]]][0]==i ) {
                    ans= (i64)ans+d[v[i-v[a[j]]]][v[i-v[b[j]]]][v[i-v[c[j]]]][1];
                }

                if ( d[v[a[j]]][v[b[j]]][v[c[j]]][0]!=i ) {
                    d[v[a[j]]][v[b[j]]][v[c[j]]][0]= i;
                    d[v[a[j]]][v[b[j]]][v[c[j]]][1]= 0;
                }
                ++d[v[a[j]]][v[b[j]]][v[c[j]]][1];
            }

            sol= sol+(i64)sign[i]*ans;
        }
    }

    fout<<sol<<"\n";

    return 0;
}