Cod sursa(job #3138806)

Utilizator ReBeGhElRebegea Stefan ReBeGhEl Data 22 iunie 2023 14:23:21
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

const int NMAX = 1e6 + 7;
int lsp[NMAX];

int fr[NMAX];
vector<pair<int, int>> getFactorizare(int n) { // O(numar de factori primi) = O(log_2(n))
	vector<pair<int, int>> factorizare;
	while(n != 1) {
		if(factorizare.size() == 0) {
			factorizare.push_back({lsp[n], 1});
			n /= lsp[n];
		}
		else {
			int l = lsp[n];
			if(factorizare[factorizare.size() - 1].first == l) {
				factorizare[factorizare.size() - 1].second += 1;
			}
			else {
				factorizare.push_back({l, 1});
			}

			n /= l;
		}
	}

	return factorizare;
}

int nrDivs(int n) { // O(numar de factori primi) = O(log_2(n))
	vector<pair<int, int>> f = getFactorizare(n);

	int produs = 1;
	for(auto e : f) produs *= (e.second + 1);
	return produs;
}

int isPrime(int n) { // O(1)
	return lsp[n] == n;
}

vector<int> getDivs(int n) { // O(numar de divizori) = O(\tau(n)) = O(τ(n))
	auto f = getFactorizare(n);
	vector<int> divs = {1};

	for(auto e : f) { // e = pereche de forma <numar prim, exponent numar prim> = <p_i, e_i>
		vector<int> new_divs;
		for(auto d : divs) { // divs = toti divizorii lui n care sunt de forma d = p_1^(?) * p_2^(?) * ... * p_(i-1)^(?)
			/// ????
			int pow_pi = 1;
			new_divs.push_back(d); // * p_i^0
			for(int c = 1; c <= e.second; c++) {
				pow_pi *= e.first;
				new_divs.push_back(d * pow_pi); // * p_i^c cu c intre 1 si e_i
			}
		} // new_divs sa fie toti divizorii lui n care sunt de forma d = p_1^(?) * p_2^(?) * ... * p_(i-1)^(?) * p_i^(?)

		divs = new_divs;
	}

	sort(divs.begin(), divs.end());
	return divs;
}

int mobius_func(int n) {
	auto f = getFactorizare(n);

	for(auto e : f) if(e.second >= 2) return 0;
	if(f.size() % 2 == 0) return 1;
	else return -1;
}
ifstream in("pairs.in");
ofstream out("pairs.in");

int main() {
	lsp[0] = lsp[1] = 0;
	for(int i = 2; i < NMAX; i++) {
		if(lsp[i] == 0) {
			for(int j = i; j < NMAX; j += i) {
				if(lsp[j] == 0) lsp[j] = i;
			}
		}
	}

	int n; in >> n;
	for(int i = 0; i < n; i++) {
		int x; in >> x;

		//for(auto d : getDivs(x)) fr[d]++;
	}

	/*int64_t sum = 0;
	for(int i = 1; i < NMAX; i++) {
		sum += 1LL * mobius_func(i) * fr[i] * fr[i];
	}

	out << sum / 2 << endl;*/
}