Pagini recente » Cod sursa (job #1078688) | Cod sursa (job #49753) | Cod sursa (job #2323252) | Cod sursa (job #1509102) | Cod sursa (job #119783)
Cod sursa(job #119783)
#include <cstdio>
#include <vector>
using namespace std;
#define DBxG
#define FL
#define fin "pairs.in"
#define fout "pairs.out"
const int Vmax = 1001100;
const int Nmax = 100100;
int N,MAX;
int nr[Nmax];
int divnr[10];
vector <int> v;
long long cnt1; //cate is bune
long long cnt2; //cate au cmmdc>1
//v[i] - cate numere se divid cu i
//nr - numerele date
//div[i] - divizorii numarului nr[i]
void readdata()
{
int i;
freopen(fin,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i)
{
scanf("%d",&nr[i]);
if ( nr[i] > MAX )
MAX = nr[i];
}
++MAX;
v.resize(MAX);
for (i=1;i<=N;++i)
v[ nr[i] ] = 1;
}
void afla(int a)
{
int j,bun;
divnr[0]=0;
for (j=2;j*j<=a && a > 1;++j)
{
bun=0;
while (a%j==0)
{
bun=1;
a/=j;
}
if (bun)
divnr[++divnr[0]]=j;
}
if (a>1)
divnr[++divnr[0]]=a;
}
void go(int lev,int last,int prod)
{
int i;
if (lev>0)
{
if (lev%2!=0)
cnt2+=(v[prod]-1);
else
cnt2-=(v[prod]-1);
}
if (lev==divnr[0])
return ;
for (i=last+1;i<=divnr[0];++i)
go(lev+1,i,prod*divnr[i]);
}
void solve()
{
int i,j;
//aflu fiecare numar "i" cu cate numere din "nr" se divide
for (i=2;i<MAX;++i)
for (j=i+i;j<MAX;j+=i)
v[i]+=v[j];
//gata
#ifdef DBG
for (i=1;i<MAX;++i)
printf("%d ",v[i]);
printf("\n");
#endif
cnt1 = N-1;
cnt1 = cnt1 * N;
cnt1 = cnt1 / 2;
cnt2 = 0;
//incep rezolvarea propriu-zisa
for (i=1;i<=N;++i)
{
afla(nr[i]);
go(0,0,1);
}
cnt2/=2;
cnt1-=cnt2;
#ifdef FL
freopen(fout,"w",stdout);
#endif
printf("%lld\n",cnt1);
}
int main()
{
readdata();
solve();
return 0;
}