Cod sursa(job #1466078)

Utilizator cojocarugabiReality cojocarugabi Data 28 iulie 2015 16:56:55
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
# include <bits/stdc++.h>
# define ll long long
using namespace std;
ifstream fi("puteri.in");
ofstream fo("puteri.out");
const int pw[] = {-1,1};
const int nmax = 1 << 7;
int s[nmax][nmax][nmax];
int ok(int p)
{
    bool k = 0;
    for (int i = 2;i*i <= p;++i)
    if (!(p%i))
    {
        p /= i;
        if (!(p%i)) return 0;
        k = 1 - k;
    }
    if (p > 1) k = 1 - k;
    return pw[k];
}
int main(void)
{
    int n;
    fi>>n;
    int * a;
    int * b;
    int * c;
    a = new int [n+1];
    b = new int [n+1];
    c = new int [n+1];
    ll * ans;
    ans = new ll [nmax+5];
    for (int i = 1;i <= n;++i) fi>>a[i]>>b[i]>>c[i];
    for (int mod = 2;mod <= nmax;++mod)
    {
        for (int i = 1;i <= n;++i)
            s[a[i]%mod][b[i]%mod][c[i]%mod]++;
        for (int i = 1;i <= n;++i)
        {
            int x = mod - (a[i]%mod);
            int y = mod - (b[i]%mod);
            int z = mod - (c[i]%mod);
            if (x == mod) x = 0;
            if (y == mod) y = 0;
            if (z == mod) z = 0;
            int ix = mod - x;
            int iy = mod - y;
            int iz = mod - z;
            if (ix == mod) ix = 0;
            if (iy == mod) iy = 0;
            if (iz == mod) iz = 0;
            if (x == ix && iy == y && z == iz)
                ans[mod] += 1ll * (s[x][y][z] - 1) * s[x][y][z] / 2;
            else
                ans[mod] += 1ll * s[x][y][z] * s[ix][iy][iz];
            s[x][y][z] = s[ix][iy][iz] = 0;
        }
    }
    ll rs = 0;
    for (int i = 2;i <= nmax;++i) rs += ok(i) * ans[i];
    return fo << rs << '\n',0;
}