Cod sursa(job #755549)

Utilizator GrimpowRadu Andrei Grimpow Data 6 iunie 2012 11:47:31
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
#include<cstring>

using namespace std;

const char iname[]="puteri.in";
const char oname[]="puteri.out";
const int maxn=65;

ifstream f(iname);
ofstream g(oname);

int a[maxn][maxn][maxn],i,j,x,y,z,val[maxn*3],n;
unsigned long long rez;

long long calc(int x)
{
    int b[maxn][maxn][maxn],i,j,k;
    long long rez=0;
    memset(b,0,sizeof(b));
    for(i=0;i<maxn;++i)
        for(j=0;j<maxn;++j)
            for(k=0;k<maxn;++k)
                b[i%x][j%x][k%x]+=a[i][j][k];
    for(i=0;i<min(x,maxn);++i)
        for(j=0;j<min(x,maxn);++j)
            for(k=0;k<min(x,maxn);++k)
            {
                int i2=(x-i)%x,j2=(x-j)%x,k2=(x-k)%x;
                if(i2<0)
                    i2+=x;
                if(j2<0)
                    j2+=x;
                if(k2<0)
                    k2+=x;
                if(i2<maxn&&j2<maxn&&k2<maxn)
                    rez+=(long long)b[i][j][k]*(b[i2][j2][k2]-(i==i2&&j==j2%x&&k==k2));
            }
    return rez;
}
int main()
{
    f>>n;
    for(i=1;i<=n;++i)
        f>>x>>y>>z,++a[x][y][z];
    for(i=2;i<=128;++i)
        if(val[i]==0)
        {
            for(j=i*i;j<=128;j+=i*i)
                val[j]=-1;
            for(j=i;j<=128;j+=i)
                if(val[j]!=-1)
                    ++val[j];
            rez+=calc(i);
        }
        else
            if(val[i]>0)
                if(val[i]&1)
                    rez+=calc(i);
                else
                    rez-=calc(i);

    g<<rez/2<<"\n";
}