Cod sursa(job #2413486)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 23 aprilie 2019 14:13:31
Problema Puteri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

#define VARENA 0
#define INFOARENA 1

/*----------OPEN_FILES---------------*/

const char *FILEIN = "puteri.in" ;
const char *FILEOUT = "puteri.out" ;

#define FILES INFOARENA

#if FILES == 0
        FILE *in = fopen(FILEIN, "r"), *out = fopen(FILEOUT, "w") ;
#else
        std::ifstream in (FILEIN) ;
        std::ofstream out (FILEOUT) ;
#endif // FILE

/*--------------MAXS--------------*/

const int MV = 100000 ;
const int MC = 128 ;

/*-----------STARTER_PACK-------------*/

int ciur[MC + 30] ;
int fr[MC / 2 + 20][MC / 2 + 20][MC / 2 + 20] ;
int rest[MC + 30] ;

struct triplet {
        int a, b, c ;
};

triplet putere[MV + 30] ;

/*----------CIUR-----------*/

void sieve() {
        int i, j ;
        for (i = 2 ; i <= MC ; ++ i) {
                if (!ciur[i]) {
                        for (j = i ; j <= MC ; j += i) {
                                ciur[j] ++ ;
                        }
                }
        }
}

/*--------PROGRAM----------*/

int main() {
        int n, i, ra, rb, rc ;
        in >> n ;
        for (i = 1 ; i <= n ; ++ i) {
                in >> putere[i].a >> putere[i].b >> putere[i].c ;
        }
        sieve() ;
        int gcd, sol(0) ;
        for (gcd = 2 ; gcd <= 128 ; ++ gcd) {
                memset(fr, 0, sizeof fr) ;
                for (i = 1 ; i <= 128 ; ++ i) {
                        rest[i] = i % gcd ;
                }
                for (i = 1 ; i <= n ; ++ i) {
                        ra = rest[gcd - rest[putere[i].a]] ;
                        rb = rest[gcd - rest[putere[i].b]] ;
                        rc = rest[gcd - rest[putere[i].c]] ;
                        if (ra <= 64 && rb <= 64 && rc <= 64) {
                                sol += fr[ra][rb][rc] * (ciur[gcd] == 1 ? ciur[gcd] : -1 * (ciur[gcd] - 1)) ;
                        }
                        fr[rest[putere[i].a]][rest[putere[i].b]][rest[putere[i].c]] ++ ;
                }
        }
        out << sol ;
}