Pagini recente » Cod sursa (job #3202287) | Cod sursa (job #2037414) | Diferente pentru implica-te/arhiva-educationala intre reviziile 162 si 223 | Cod sursa (job #3206940) | Cod sursa (job #3286218)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
const int VMAX = 1e6;
const int NDP = 1;
bitset <VMAX + 1> in_M;
bitset <VMAX + 1> c;
int nr_mult[VMAX+1];
vector <int> prime, multime;
void ciur()
{
for (int i = 2; i <= VMAX; i++)
{
for (int mult = i; mult <= VMAX; mult += i)
{
if (in_M[mult])
{
nr_mult[i]++;
}
}
if (!c[i] && (long long)i * i <= VMAX)
{
prime.push_back(i);
for (int mult = i * i; mult <= VMAX; mult += i)
{
c[mult] = 1;
}
}
}
}
void descompune(int n, vector <int> &dp)
{
int i = 0;
while (i < (int)prime.size() && prime[i] * prime[i] <= n)
{
if (n % prime[i] == 0)
{
dp.push_back(prime[i]);
while (n % prime[i] == 0)
{
n /= prime[i];
}
}
i++;
}
if (n != 1)
{
dp.push_back(n);
}
}
int main()
{
ifstream in("pairs.in");
ofstream out("pairs.out");
int n;
in >> n;
multime.resize(n);
for (int i = 0; i < n; i++)
{
in >> multime[i];
in_M[multime[i]] = 1;
}
ciur();
long long nr_perechi = 0;
for (auto m: multime)
{
vector <int> div_primi;
div_primi.clear();
descompune(m, div_primi);
int ndp = div_primi.size();
//out << m << ": ";
nr_perechi += n;
for (int i = 1; i < (1 << ndp); i++)
{
int divizor = 1, nrdiv = 0;
for (int j = 0; j < ndp; j++)
{
if (i & (1 << j))
{
divizor *= div_primi[j];
nrdiv++;
}
}
if (nrdiv % 2 == 0)
{
nr_perechi += nr_mult[divizor];
}
else
{
nr_perechi -= nr_mult[divizor];
}
//out << divizor << " ";
}
//out << nr_perechi << "\n";
}
out << nr_perechi / 2 << "\n";
in.close();
out.close();
return 0;
}