Cod sursa(job #3233471)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 3 iunie 2024 15:21:49
Problema Puteri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;

bool is_prime(int n)
{
	for(int i = 2;i * i <= n;++i)
		if(n % i == 0)
			return false;
	return true;
}

const int nmax = 128;
int c[nmax][nmax][nmax];

long long get(const vector<vector<int>>& v, const vector<int>& divs)
{
	int n = v.size();
	long long ans = 0;
	
	for(int i = 0;i < divs.size();++i)
	{
		memset(c, 0, sizeof(c));
		for(int j = 0;j < n;++j)
		{
			int r[3], tmp[3];
			for(int k = 0;k < 3;++k)
				r[k] = v[j][k] % divs[i];
			for(int k = 0;k < 3;++k)
			{
				int d = divs[i] - r[k];
				if(d == divs[i])
					d = 0;
				tmp[k] = d;
			}
			ans += c[tmp[0]][tmp[1]][tmp[2]];
			++c[r[0]][r[1]][r[2]];
		}
	}
	return ans;
}

int main() {
	ios::sync_with_stdio(false);
	freopen("puteri.in", "r", stdin);
	freopen("puteri.out", "w", stdout);
	int n;
	cin >> n;
	vector<vector<int>> v(n, vector<int>(3));
	for(int i = 0;i < n;++i)
		cin >> v[i][0] >> v[i][1] >> v[i][2];
	
	vector<int> one;
	for(int i = 2;i <= 128;++i)
		if(is_prime(i))
			one.push_back(i);
	vector<int> two, three;
	for(int i = 0;i < one.size();++i)
		for(int j = i + 1;j < one.size();++j)
			if(one[i] * one[j] <= 128)
				two.push_back(one[i] * one[j]);
	for(int i = 0;i < one.size();++i)
		for(int j = i + 1;j < one.size();++j)
			for(int k = j + 1;k < one.size();++k)
				if(one[i] * one[j] * one[k] <= 128)
					three.push_back(one[i] * one[j] * one[k]);
	long long ans = 0;
	ans += get(v, one);
	ans -= get(v, two);
	ans += get(v, three);
	cout << ans << "\n";
}