Pagini recente » Cod sursa (job #1212284) | Cod sursa (job #2878892) | Cod sursa (job #1548380) | Cod sursa (job #3153493) | Cod sursa (job #2883082)
#include <bits/stdc++.h>
#define NUMMAX 1000005
using namespace std;
/*******************************/
// INPUT / OUTPUT
ifstream f("pairs.in");
ofstream g("pairs.out");
/*******************************/
/// GLOBAL DECLARATIONS
int N;
long long ans;
int x, maxNum;
bool ciur[NUMMAX];
int dv[NUMMAX], lastPrime[NUMMAX];
/*******************************/
/// FUNCTIONS
void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
f >> N;
for (int i = 1 ; i <= N ; ++ i)
{
f >> x;
dv[x] ++;
maxNum = max(maxNum, x);
}
}
///-------------------------------------
inline void Ciur()
{
for (int i = 2 ; 2 * i <= maxNum ; ++ i)
{
if (!ciur[i]) lastPrime[i] = i;
for (int j = 2 * i ; j <= maxNum ; j += i)
{
dv[i] += dv[j];
if (!ciur[i])
{
ciur[j] = true;
lastPrime[j] = i;
}
}
}
}
///-------------------------------------
inline void Solve()
{
int num, prevPrime = -1;
long long numPairs;
bool ok = true;
int cnt = 0;
ans = 1LL * N * (N - 1) / 2;
for (int i = 2 ; i <= maxNum ; ++ i)
{
num = i;
prevPrime = 0;
ok = true;
cnt = 0;
while (lastPrime[num])
{
cnt ++;
if (lastPrime[num] == prevPrime)
{
ok = false;
break;
}
prevPrime = lastPrime[num];
num /= lastPrime[num];
}
if (ok)
{
numPairs = 1LL * dv[i] * (dv[i] - 1) / 2;
if (cnt % 2 == 1) ans -= numPairs;
else ans += numPairs;
}
}
}
///-------------------------------------
inline void Solution()
{
Ciur();
Solve();
}
///-------------------------------------
inline void Output()
{
g << ans;
}
///-------------------------------------
int main()
{
ReadInput();
Solution();
Output();
return 0;
}