Cod sursa(job #2607003)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 29 aprilie 2020 00:33:59
Problema Puteri Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("puteri.in");
ofstream g("puteri.out");

int n,a[100005],b[100005],c[100005];
int dp[70][70][70];
int prim[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,30,42}; ///20
int multi[]={6,10,14,22,26,34,38,46,58,62,21,33,39,51,57,35,55}; ///17
long long rasp=0;
bool semn;

void init()
{
 for(int i=0;i<=64;i++)
  for(int j=0;j<=64;j++)
   for(int z=0;z<=64;z++)
     dp[i][j][z]=0;
}

void dinamica(int k)
{
  init();
  long long sol=0,unic=0;
  int x,y,h;
  for(int i=1;i<=n;i++)
   {
    x=a[i]%k,y=b[i]%k,h=c[i]%k;
    dp[x][y][h]++;
   }
  for(int i=0;i<k;i++)
   for(int j=0;j<k;j++)
    for(int z=0;z<k;z++)
   {
    if(i==0) x=0;
    else x=k-i;
    if(j==0) y=0;
    else y=k-j;
    if(z==0) h=0;
    else h=k-z;
    if(i==x&&j==y&&z==h) {
                          if(dp[i][j][z]>1) unic+=1LL*dp[i][j][z]*(dp[i][j][z]-1)/2;
                         }
    else sol+=1LL*dp[i][j][z]*dp[x][y][h];
   }
  sol/=2;
  rasp+=(sol+unic)*semn;
}

int main()
{
f>>n;
for(int i=1;i<=n;i++)
 f>>a[i]>>b[i]>>c[i];
///adunam
semn=1;
for(int i=0;i<20;i++)
  dinamica(prim[i]);
///scadem
semn=-1;
for(int i=0;i<17;i++)
  dinamica(multi[i]);

g<<rasp;
}