Cod sursa(job #2383420)

Utilizator nurof3nCioc Alex Andrei nurof3n Data 19 martie 2019 14:47:27
Problema Puteri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int N_MAX = 100001;

int N;
int a[N_MAX], b[N_MAX], c[N_MAX];
int nr[65][65][65];
int bit[129], rest[129];
bool isprime[129];
long long sol;

long long compute(int mod) {
    long long sol = 0;
    memset(nr, 0, sizeof(nr));
    for(int i = 0; i <= 128; ++i)
        rest[i] = i % mod;

    for(int i = 1; i <= N; ++i) {
        int ra = rest[mod - rest[a[i]]];
        int rb = rest[mod - rest[b[i]]];
        int rc = rest[mod - rest[c[i]]];
        if(ra <= 64 && rb <= 64 && rc <= 64)
            sol += nr[ra][rb][rc];
        ++nr[rest[a[i]]][rest[b[i]]][rest[c[i]]];
    }

    return sol;
}

int main() {
    in >> N;
    for(int i = 1; i <= N; ++i)
        in >> a[i] >> b[i] >> c[i];

    for(int i = 2; i <= 128; ++i)
        isprime[i] = true, bit[i] = -1;

    for(int p = 2; p <= 128; ++p) {
        if(isprime[p]) {
            for(int i = p; i <= 128; i += p)
                isprime[i] = false, bit[i] *= -1;     //ciur + numarare (paritate) nr factori din descompunere
            for(int i = p * p; i <= 128; i += p * p)
                bit[i] = 0;     //nu luam la pinex numerele care au exponent >= 2 in descompunere
        }
        if(bit[p] != 0)
            sol += bit[p] * compute(p);
    }

    out << sol;

    return 0;
}