Pagini recente » Cod sursa (job #2781214) | Cod sursa (job #975921) | Cod sursa (job #709596) | Cod sursa (job #1710996) | Cod sursa (job #3138804)
#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;*/
}