Pagini recente » Cod sursa (job #437470) | Cod sursa (job #227336) | Cod sursa (job #1658995) | Cod sursa (job #2298687) | Cod sursa (job #3297778)
#include <bits/stdc++.h>
#define VMAX 1000001
#define NMAX 100001
#define DIV 7
using namespace std;
int n;
int m[NMAX]; ///multimea citita
bitset<VMAX> apare;
int cautare_binara(int x)
{
int st=1, dr=n, poz=0;
while(st<=dr)
{
int mij=st+(dr-st)/2;
if(m[mij]>=x)
{
dr=mij-1;
poz=mij;
}
else
{
st=mij+1;
}
}
return poz;
}
int nr_div[NMAX]; ///numarul de divizori primi ai elementelor din matrice
int lista_div[NMAX][DIV]; ///lista divizorilor elementelor din matrice
int produs_div[VMAX]; ///produsul divizorilor primi ai unui numar
int nr_multiplii[VMAX]; ///salvam de cate ori fiecare numar apare ca divizor al unui numar din multime
void eratostene()
{
for(int i=1; i<VMAX; i++)
produs_div[i]=1;
for(int j=2; j<VMAX; j+=2)
{
produs_div[j]*=2;
if(apare[j]==1) ///daca j apare in multime
{
int poz=cautare_binara(j);
lista_div[poz][nr_div[poz]]=2;
nr_div[poz]++;
}
}
for(int i=3; i<VMAX; i+=2)
{
if(produs_div[i]==1)
{
for(int j=i; j<VMAX; j+=i)
{
produs_div[j]*=i;
if(apare[j]==1) ///daca j apare in multime
{
int poz=cautare_binara(j);
lista_div[poz][nr_div[poz]]=i;
nr_div[poz]++;
}
}
}
}
}
long long PIE()
int main()
{
ifstream cin("pairs.in");
ofstream cout("pairs.out");
cin >> n;
for(int i=1; i<=n; i++)
{
cin >> m[i];
apare[m[i]]=1;
}
sort(m+1, m+n+1);
eratostene();
for(int i=1; i<VMAX; i++)
{
for(int j=i; j<VMAX; j+=i)
{
if(apare[j]==1) ///daca j apare in multime
{
nr_multiplii[i]++;
}
}
}
long long nr_perechi=(long long)n*(n-1)/2;
for(int i=1; i<=n; i++)
{
nr_perechi-=PIE(i);
}
cout << nr_perechi;
return 0;
}