Cod sursa(job #2102821)

Utilizator Bodo171Bogdan Pop Bodo171 Data 9 ianuarie 2018 15:21:25
Problema Puteri Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int nmax=100005;
string s;
int ap[128][128][128];
int a[nmax],b[nmax],c[nmax],d[200],e[200],inv[200];
long long pairs,tot;
int n,i,j,mod,x,y,z,mx,nm,num,ch;
int getnum()
{
    num=0;
    while(s[ch]>='0'&&s[ch]<='9')
    {
        num=num*10+s[ch]-'0';
        ch++;
    }
    ch++;
    return num;
}
int main()
{
    ifstream f("puteri.in");
    ofstream g("puteri.out");
    f>>n;getline(f,s);
    for(i=1;i<=n;i++)
    {
        getline(f,s);ch=0;
        a[i]=getnum();b[i]=getnum();c[i]=getnum();
        if(a[i]>mx) mx=a[i];
        if(b[i]>mx) mx=b[i];
        if(c[i]>mx) mx=c[i];
    }
    nm=2*mx;
    for(i=2;i<=nm;i++)
        if(d[i]==0)
    {
        for(j=i;j<=nm;j+=i)
        {
            if(d[j]!=-1)d[j]++;
            if(j%(i*i)==0) d[j]=-1;
        }
    }
    for(mod=2;mod<=nm;mod++)
        if(d[mod]!=-1)
    {
        pairs=0;
        for(i=1;i<=nm;i++)
        {
            e[i]=e[i-1]+1;
            if(e[i]==mod)
                e[i]=0;
        }
        for(i=1;i<mod;i++)
            inv[i]=mod-i;
        for(i=1;i<=n;i++)
        {
            x=e[a[i]];y=e[b[i]];z=e[c[i]];
            pairs+=1LL*ap[inv[x]][inv[y]][inv[z]];
            ap[x][y][z]++;
        }
        for(i=1;i<=n;i++)
        {
            x=e[a[i]];y=e[b[i]];z=e[c[i]];
            ap[x][y][z]--;
        }
        if((d[mod]&1)) tot+=1LL*pairs;
        else tot-=1LL*pairs;
    }
    g<<tot;
    return 0;
}