Pagini recente » Cod sursa (job #2839366) | Cod sursa (job #305475) | Cod sursa (job #1786818) | Cod sursa (job #1263757) | Cod sursa (job #1346136)
#include <fstream>
using namespace std;
ifstream is("pairs.in");
ofstream os("pairs.out");
long long M, x, maxim(-1);
bool Ap[1000001]; // x apare in multime daca Ap[x] = 1
bool notPrime[1000001]; // x nu este prim daca notPrime[x] = 1
bool notGord[1000001]; // daca notGord[x] = 1 atunci puterea unui factor prim al lui x este diferita de 1
int nrF[1000001]; // nrF[x] - cati factori primi distincti are x
int main()
{
is >> M;
for ( int i = 1; i <= M; ++i )
{
is >> x;
maxim = max(maxim,x);
Ap[x] = 1;
}
for ( int i = 2; i <= maxim; ++i )
{
if ( !notPrime[i] )
{
for ( int j = i; j <= maxim; j += i )
{
nrF[j]++;
notPrime[j] = 1;
if ( j % (i*i) == 0 )
notGord[j] = 1;
}
}
}
long long nr(0);
long long Sol(0);
for ( int i = 2; i <= maxim; ++i )
{
if ( notGord[i] == 0 )
{
nr = 0;
for ( int j = i;j <= maxim; j += i )
if ( Ap[j] == 1 )
nr++;
if ( nrF[i] % 2 == 1 )
Sol += (nr*(nr-1)/2);
else
Sol -= (nr*(nr-1)/2);
}
}
os << (M*(M-1))/2 - Sol;
is.close();
os.close();
}