Cod sursa(job #2720068)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 10 martie 2021 16:04:43
Problema Puteri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>

#define NMAX 100005
using namespace std;


class InParser{
private:
    FILE *fin;
    char *buff;
    int sp;
    char read(){
        ++sp;
        if(sp == 4096){
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }
public:
    InParser(const char* nume){
        sp = 4095;
        buff = new char[4096];
        fin = fopen(nume, "r");
    }

    InParser& operator >> (int &n){
        char c;
        while(!isdigit(c = read()));
        n = c - '0';
        while(isdigit(c = read()))
            n = n * 10 + c - '0';
        return *this;
    }
};
InParser fin("puteri.in");
ofstream fout("puteri.out");

typedef long long ll;
int a[NMAX], b[NMAX], c[NMAX], mod[130], fr[65][65][65], n;

ll solve(int i){
    memset(mod, 0, sizeof(mod));
    memset(fr, 0, sizeof(fr));
    for(int j = 0; j <= 128; ++j)
        mod[j] = j % i;
    ll ans = 0;
    int axA, axB, axC;
    for(int k = 1; k <= n; ++k){
        axA = mod[i - mod[a[k]]];
        axB = mod[i - mod[b[k]]];
        axC = mod[i - mod[c[k]]];

        if(axA <= 64 && axB <= 64 && axC <= 64)
            ans += fr[axA][axB][axC];
        fr[mod[a[k]]][mod[b[k]]][mod[c[k]]]++;
    }
    return ans;
}

int main()
{
    fin >> n;

    for(int i = 1; i <= n; ++i)
        fin >> a[i] >> b[i] >> c[i];

    ll rez = 0;
    for(int i = 2; i <= 128; ++i){
        int semn = -1;
        int ax = i;
        for(int j = 2; j <= i; ++j){
            int cn = 0;
            while(ax % j == 0){
                ++cn;
                ax /= j;
            }

            if(cn > 1)
                semn = 0;
            if(cn == 1)
                semn *= -1;
        }

        if(semn != 0)
            rez += semn * solve(i);
    }

    fout << rez << '\n';
    return 0;
}