Pagini recente » Cod sursa (job #2063681) | Cod sursa (job #284322) | Cod sursa (job #84286) | Cod sursa (job #1442572) | Cod sursa (job #3255457)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
const int valmax = 1000000;
int n;
long long sol;
vector <int> dz;
int x[valmax + 5];
bool p[1010 + 5];
int b[16];
int nr[16];
void preprocess()
{
p[0]=p[1]=true;
for(int i = 2; i<=1000; i++)
if(!p[i])
{
dz.push_back(i);
for(int j = 2* i; j<=1000; j+=i)
p[j]=true;
}
}
void desc(int x)
{
nr[0]=0;
for(auto& i : dz)
{
if(i*i > x)
break;
if(x%i==0)
{
nr[++nr[0]]=i;
while(x%i==0)
x/=i;
}
}
if(x!=1)
nr[++nr[0]]=x;
}
void bk(int pas,long long prod=1)
{
if(pas!=1)
{
if(pas%2)
sol+=x[prod];
else
sol-=x[prod];
x[prod]++;
}
if(pas>nr[0])
return;
for(int i = b[pas-1] + 1; i<=nr[0]; i++)
{
b[pas]=i;
bk(pas+1,prod*nr[b[pas]]);
}
}
int main()
{
preprocess();
fin>>n;
for(int i=1; i<=n; i++)
{
sol+=i-1;
int x;
fin>>x;
desc(x);
bk(1,1);
}
fout<<sol;
}