Pagini recente » Cod sursa (job #1217666) | Cod sursa (job #48415) | Cod sursa (job #2759812) | Cod sursa (job #2594230) | Cod sursa (job #690550)
Cod sursa(job #690550)
#include <fstream>
#include <cstring>
#include <cmath>
#define maxn 1000000
#define MAX 1000100
using namespace std;
int x[MAX],rad,prime[300002],b[300002],m,multime[300002],a[100002],n;
long long prod,sol;
bool neprime[MAX],in[MAX];
void back(int k)
{
if(k==m+1) return;
for(int i=b[k-1]+1;i<=m;i++)
{
b[k]=i;
prod*=multime[b[k]];
if(prod>MAX) {prod/=multime[b[k]]; continue; }
if(k%2) sol-=x[prod]*(x[prod]-1)/2; else sol+=x[prod]*(x[prod]-1)/2;
back(k+1);
prod/=multime[b[k]];
}
}
void ciur()
{
int pr=0;
for(int i=2;i<=1000000;i++)
if(!neprime[i])
{
prime[++pr]=i;
for(int j=i+i;j<=1000000;j+=i) neprime[j]=1;
}
}
int main()
{
int i,j;
ifstream fi("pairs.in");
ofstream fo("pairs.out");
fi>>n;
sol=n*(n-1)/2;
ciur();
memset(neprime,0,sizeof(neprime));
//neprime[]=in multime
for(i=1;i<=n;i++)
{
fi>>a[i];
in[a[i]]=1;
rad=(int)sqrt((double)a[i]);
for(int d=1;prime[d]<=rad;d++)
if(a[i]%prime[d]==0)
{
if(!neprime[prime[d]]) multime[++m]=prime[d];
while(a[i]%prime[d]==0) a[i]/=prime[d];
neprime[prime[d]]=1;
}
if(a[i]!=1 and !neprime[a[i]]) { multime[++m]=a[i]; neprime[a[i]]=1;}
}
for(i=2;i<=maxn;i++)
for(j=i;j<=maxn;j+=i)
if(in[j]) x[i]++;
prod=1;
back(1);
fo<<sol<<"\n";
return 0;
}