Pagini recente » Cod sursa (job #1764050) | Cod sursa (job #41005) | Cod sursa (job #2230596) | Cod sursa (job #993329) | Cod sursa (job #214622)
Cod sursa(job #214622)
#include <stdio.h>
#include <vector>
using namespace std;
const int n_max = 2000020;
vector <bool> m(n_max,false);
char nr[n_max];
long long sol, n, maxim;
void read()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf(" %lld", &n);
long long t;
for (int i = 1; i <= n; ++ i)
{
scanf("%lld", &t);
if (maxim < t)
maxim = t;
m[t] =1;
}
}
inline long long combinari(long long x)
{
return (long long)(1<<x)-1;
}
void solve()
{
long long i, j;
for (i = 2; i<= maxim; ++i)
{
int v = 0;
if (nr[i] == -1)
continue;
if (nr[i] == 0)
for (j = i; j <= maxim; j+=i)
{
if (nr[j] != -1)
++nr[j];
}
long long k = i*i;
for (j = i; j <= maxim; j+=i)
{
if (m[j])
++v;
}
if (2*k <= 1000)
for (j = k; j <= maxim; j+=k)
nr[j] = -1;
else
if(k<=1000)
nr[k] = -1;
if (nr[i]%2 == 0)
sol+=combinari(v);
else
sol-=combinari(v);
/*fprintf(stderr,"DEBUG: PT I=%lld MERGE!!J =%lld\n", i, j);
fflush(stdout);*/
}
}
void print()
{
printf("%lld\n", sol);
}
void test()
{
while (1)
;
}
int main()
{
read();
sol = combinari(n);
solve();
print();
return 0;
}