Pagini recente » Cod sursa (job #515098) | Cod sursa (job #2100868) | Cod sursa (job #1574387) | Cod sursa (job #3121656) | Cod sursa (job #981528)
Cod sursa(job #981528)
#include <fstream>
#include <vector>
#define MAXN 100005
#define sqrtMAXM 1050
#define MAXM 1000005
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int n,v[MAXN],x,nrmul[MAXM],nr,semn[MAXM];
long long sol;
vector<int> prime,divizori;
bool noprime[sqrtMAXM];
int main()
{
int i,j,k;
f>>n;
for(i=1;i<=n;i++)
f>>v[i];
for(i=2;i<sqrtMAXM;i++){
if(!noprime[i]){
prime.push_back(i);
for(j=2*i;j<sqrtMAXM;j+=i)
noprime[j]=1;}}
for(i=1;i<=n;i++){
x=v[i];
divizori.clear();
for(j=0;prime[j]*prime[j]<=x;j++)
if(!(x%prime[j])){
divizori.push_back(prime[j]);
while(!(x%prime[j]))
x/=prime[j];}
if(x>1)
divizori.push_back(x);
for(j=0;j<(1<<(divizori.size()));j++){
nr=1;
for(k=0;k<divizori.size();k++)
if(j&(1<<k))
nr*=divizori[k];
nrmul[nr]++;
if(!semn[nr]){
x=1;
for(k=0;k<divizori.size();k++)
if(j&(1<<k))
x=-x;
semn[nr]=x;}}}
for(i=1;i<MAXM;i++)
sol+=1LL*nrmul[i]*(nrmul[i]-1)*semn[i]/2;
g<<sol<<'\n';
f.close();
g.close();
return 0;
}