Pagini recente » Cod sursa (job #1055053) | Cod sursa (job #3038625) | Cod sursa (job #235938) | Cod sursa (job #2236666) | Cod sursa (job #3266031)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n, x, i, divi[1000005], j, maxim, fr[1000005], ciur[1000005];
vector <int> prim;
long long ans;
int main()
{
fin>>n;
ciur[0]=ciur[1]=1;
for(i=2; i<=1e6; i++)
if(ciur[i]==0)
{
prim.push_back(i);
for(j=2*i; j<=1e6; j+=i)
ciur[j]=1;
}
for(i=1; i<=n; i++)
{
fin>>x;
int cx=x;
int d=prim[0], k=0;
vector <int> frp;
while(x>1)
{
if(x%d==0)
{
frp.push_back(d);
while(x%d==0)
x/=d;
}
k++;
d=prim[k];
if(prim[k]*prim[k]>x && x>1)
d=prim[k];
}
k=frp.size();
for(int mask=0; mask<(1<<k); mask++)
{
int nr=0, pr=1;
for(j=0; j<k; j++)
if(mask&(1<<j))
{
nr++;
pr*=frp[j];
}
if(nr!=0)
{
if(nr%2)
ans+=fr[pr];
else
ans-=fr[pr];
}
}
for(j=1; j*j<cx; j++)
if(cx%j==0)
{
fr[j]++;
fr[cx/j]++;
}
if(j*j==cx)
fr[j]++;
}
fout<<n*(n-1)/2-ans;
return 0;
}