Cod sursa(job #3263354)

Utilizator vladsoartavlad sofronea vladsoarta Data 14 decembrie 2024 10:50:13
Problema Puteri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <cstring>
#define int long long
using namespace std;
ifstream cin("puteri.in");
ofstream cout("puteri.out");

struct nr
{
    int a2,b3,c5;
} num[100001];

int n,a,b,c;
int sign[129];
int ciur[129];

int numereprimediv(int nr)
{
    int d=2,divprimi=0;
    while(nr>1)
    {
        bool op=0;
        while(nr%d == 0)
            nr/=d,op=1;

        if(op)
            divprimi++;

        d++;
        if(d*d > nr)
            d=nr;
    }

    return divprimi;
}
int elems[65][65][65],m[134];

int solve(int mod)
{

    int new2,new3,new5;
    int comb=0;
    memset(elems,0,sizeof(elems));
    for(int i=0; i<=128; i++)
        m[i] = i%mod;

    for(int i=1; i<=n; i++)
    {
        new2 = m[mod - m[num[i].a2]];
        new3 = m[mod - m[num[i].b3]];
        new5 = m[mod - m[num[i].c5]];

        if(new2<=64 && new3<=64&&new5<=64)
            comb += elems[new2][new3][new5];
        elems[m[num[i].a2]][m[num[i].b3]][m[num[i].c5]]++;
    }
    return comb;
}

int32_t main()
{
    int rsp=0;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int a2,b3,c5;
        cin>>a2>>b3>>c5;
        num[i]= {a2,b3,c5};
    }

    fill(sign+1,sign+128+1,1);

    for(int i=2; i<=128; i++)
    {
        if(!ciur[i])
        {
            for(int j=i; j<=128; j+=i)
            {
                sign[j]*=-1;
                ciur[j]=1;
            }

            for(int j=i*i; j<=128; j+=i*i)
                sign[j]=0;
        }
        rsp-=sign[i] * solve(i);
    }

    cout<<rsp;

    return 0;
}