Cod sursa(job #690530)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 25 februarie 2012 18:23:37
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <cstring>
#include <cmath>
#define maxn 1000000
#define MAX 1000100
using namespace std;
int x[MAX],rad,prime[300002],k,m,multime[300002],a[100002],n;
long long prod,sol;
bool neprime[MAX],in[MAX];
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=1;i<=maxn;i++)
	for(j=i;j<=maxn;j+=i) 
		if(in[j]) x[i]++;
	for(i=1;i<(1<<m);i++)
	{
		prod=1; k=0;
		for(j=0;j<m;j++)
		if(i&(1<<j)) { k++; prod*=multime[j+1]; }
		if(k%2) sol-=x[prod]*(x[prod]-1)/2; else sol+=x[prod]*(x[prod]-1)/2;
	}
	fo<<sol<<"\n";
	return 0;
}