Pagini recente » Cod sursa (job #2861670) | Cod sursa (job #514998) | Cod sursa (job #2934394) | Cod sursa (job #420267) | Cod sursa (job #110684)
Cod sursa(job #110684)
#include<stdio.h>
const int maxn = 100001;
int i;
int n;
int j;
int ciur[10000];
int s[1000];
int a[maxn];
int nr[10000];
int si[maxn * 10];
int prod;
int nr1;
int b[maxn];
long long sol;
void bkts(int i)
{
if (i > s[0])
{
if ((nr1 & 1) == 1) sol -= si[prod];
else sol += si[prod];
return;
}
for(b[i] = 0;b[i] <= 1; ++b[i])
{
if (b[i] == 1)
{
++nr1;
prod *= s[i];
}
bkts(i + 1);
if (b[i] == 1)
{
--nr1;
prod /= s[i];
}
}
}
void bkta(int i)
{
if (i > s[0])
{
++si[prod];
return;
}
for(b[i] = 0;b[i] <= 1; ++b[i])
{
if (b[i] == 1)
{
prod *= s[i];
}
bkta(i + 1);
if (b[i] == 1)
{
prod /= s[i];
}
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
// printf("%d\n",sizeof(ciur) + sizeof(a) + sizeof(si));
scanf("%d",&n);
for(i = 1;i <= n; ++i)
{
scanf("%d",&a[i]);
}
for(i = 2;i <= 1001;++i)
{
if (ciur[i] != 0) continue;
nr[++nr[0]] = i;
for(j = i;j <= 1001; j += i)
{
ciur[j] = 1;
}
}
for(i = 1;i <= n; ++i)
{
prod = 1;
s[0] = 0;
nr1 = 0;
for(j = 1;j <= nr[0]; ++j)
{
if (a[i] % nr[j] == 0)
{
s[++s[0]] = nr[j];
while(a[i] % nr[j] == 0)
{
a[i] /= nr[j];
}
if (a[i] == 1) break;
}
}
if (a[i] != 1)
{
s[++s[0]] = a[i];
}
bkts(1);
prod = 1;
bkta(1);
}
printf("%lld\n",sol);
}