Pagini recente » Cod sursa (job #1133007) | Cod sursa (job #2719628) | Cod sursa (job #1857252) | Cod sursa (job #1241432) | Cod sursa (job #1344847)
#include <stdio.h>
#define inf 1000023LL
#define NMAX 100023LL
#define LL long long int
FILE *fin, *fout;
LL n, temp = 1, div[57], size, val, rez, arr[57], nr;
void fp(LL a)
{
if(a%2 == 0)
{
div[size] = 2;
size++;
temp *= 2;
while(a%2 == 0) a/=2;
}
for(LL i = 3; i*i <= a && a> 1; i+=2)
{
if(a%i) continue;
div[size] = i;
size++;
temp *= i;
while(a%i == 0) a/=i;
}
if(a > 1)
{
div[size] = a;
size++;
temp *= a;
}
}
bool check[inf];
LL vef()
{
LL rez1 = 1, count = 0;
for(LL i = 1; i<= nr; i++) rez1 *= div[arr[i]-1];
for(LL i = 1; i <= inf; i++)
{
if(rez1*i >= inf) break;
if(check[rez1*i]) count++;
}
return (count*(count-1))/2;
}
LL comb(LL len, LL pos)
{
LL rez1 = 0;
if(pos == len+1) return vef();
for(LL i = arr[pos-1]+1; i<=size; i++)
{
arr[pos] = i;
rez1 += comb(len, pos+1);
}
return rez1;
}
int main()
{
fin = freopen("pairs.in", "r", stdin);
fout = freopen("pairs.out", "w", stdout);
scanf("%lld", &n);
rez = (n*(n-1))/2;
for(LL i = 0; i< n; i++)
{
scanf("%lld", &val);
check[val] = 1;
for(LL j = 0; j< size; j++)
{
if(val%div[j]) continue;
while(val%div[j] == 0) val/=div[j];
}
fp(val);
}
for(LL i = 1; i<=size; i++)
{
nr = i;
if(i%2) rez -= comb(i, 1);
else rez+= comb(i, 1);
}
printf("%lld\n", rez);
fclose(fin);
fclose(fout);
return 0;
}