Cod sursa(job #2607034)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 29 aprilie 2020 01:52:52
Problema Puteri Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

class InParser
{
#pragma warning(disable:4996)
private:
	FILE* fin;
	char* buff;
	int sp;
	char read()
	{
		++sp;
		if (sp == 4096)
		{
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}
public:
	InParser(const char* nume)
	{
		sp = 4095;
		buff = new char[4096];
		fin = fopen(nume, "r");
	}
	InParser& operator >> (int& n)
	{
		char c;
		while (!isdigit(c = read()));
		n = c - '0';
		while (isdigit(c = read()))
			n = n * 10 + c - '0';
		return *this;
	}
};

int n,a[100005],b[100005],c[100005];
int dp[66][66][66],semn[132];
bool ciur[132];
long long rasp=0;

long long int dinamica(int k)
{
  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]++;
   }
  int maxim=min(64,k);
  for(int i=0;i<=maxim;i++)
   for(int j=0;j<=maxim;j++)
    for(int z=0;z<=maxim;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 if(x<=64&&y<=64&&h<=64) sol+=1LL*dp[i][j][z]*dp[x][y][h];
   }
  sol/=2;
  memset(dp,0,sizeof dp);
  return sol+unic;
}

int main()
{
InParser f("puteri.in");
ofstream g("puteri.out");
f>>n;
for(int i=1;i<=n;i++)
 f>>a[i]>>b[i]>>c[i];
for(int i=1;i<=128;i++)
 semn[i]=1;
for(int i=2;i<=128;i++)
 {
  if(ciur[i]==0)
   {
    for(int j=i;j<=128;j+=i)
     {
      semn[j]*=-1;
      ciur[j]=1;
     }
    for(int j=i*i;j<=128;j+=i*i)
     semn[j]=0;
   }
  if(semn[i]!=0)
    rasp-=1LL*semn[i]*dinamica(i);
 }
g<<rasp;
}