Pagini recente » Cod sursa (job #2984200) | Cod sursa (job #2607011) | Cod sursa (job #3192781) | Cod sursa (job #1831823) | Cod sursa (job #2647501)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 1000;
int a[NMAX + 5][NMAX + 5] , coef[NMAX + 5] , p[NMAX + 5] , f[NMAX + 5];
void pinex()
{
int i , j;
for(i = 2 ; i <= NMAX ; i ++)
{
coef[i] = -1;
p[i] = 1;
}
for(i = 2 ; i <= NMAX ; i ++)
{
if(p[i] == 1)
for(j = i ; j <= NMAX ; j += i)
{
coef[j] = -coef[j];
p[j] *= i;
}
else if(p[i] != i)
coef[i] = 0;
}
}
void add(int d , int x)
{
a[d][x] ++;
a[d][0] ++;
}
void desc(int x)
{
int d , exp , cx = x;
d = 2;
while(d * d <= x)
{
exp = 0;
while(x % d == 0)
{
x /= d;
exp ++;
}
if(exp)
add(d , cx);
d ++;
}
if(x > 1)
add(x , cx);
}
long long fast_pow(long long a , int p)
{
long long aa = a;
a = 1;
for( ; p ; p = (p >> 1))
{
if(p & 1)
a = a * aa;
aa = aa * aa;
}
return a;
}
void intersectie(int b[])
{
for(int i = 1 ; i <= NMAX ; i ++)
f[i] = min(f[i] , b[i]);
}
int card(int x)
{
int d , exp , i , c = 0;
for(i = 1 ; i <= NMAX ; i ++)
f[i] = NMAX;
d = 2;
while(d * d <= x)
{
exp = 0;
while(x % d == 0)
{
x /= d;
exp ++;
}
if(exp)
intersectie(a[d]);
d ++;
}
if(x > 1)
intersectie(a[x]);
for(i = 1 ; i <= NMAX ; i ++)
c += f[i];
return c;
}
int main()
{
freopen("indep.in" , "r" , stdin);
freopen("indep.out" , "w" , stdout);
int n , i , x;
long long sol;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &x);
desc(x);
}
pinex();
sol = fast_pow(2 , n) - 1;
for(i = 2 ; i <= NMAX ; i ++)
if(coef[i] != 0)
sol = sol - coef[i] * (fast_pow(2 , card(i)) - 1);
printf("%lld\n" , sol);
return 0;
}