Pagini recente » Cod sursa (job #1938480) | Cod sursa (job #62226) | Cod sursa (job #1099630) | Cod sursa (job #3040459) | Cod sursa (job #2647502)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 1000;
int a[NMAX + 5][NMAX + 5] , coef[NMAX + 5] , p[NMAX + 5] , f[NMAX + 5];
class HugeN
{
private:
int a[NMAX + 5];
public:
HugeN(int x = 0)
{
memset(a , 0 , sizeof(a));
if(x)
{
a[0] = 1;
a[1] = x;
}
}
HugeN operator*(const HugeN& b)
{
int i , j , tr , aux;
HugeN c;
c.a[0] = a[0] + b.a[0] - 1;
for(i = 1 ; i <= a[0] ; i ++)
for(j = 1 ; j <= b.a[0] ; j ++)
c.a[i + j - 1] += (a[i] * b.a[j]);
tr = 0;
for(i = 1 ; i <= c.a[0] ; i ++)
{
aux = tr + c.a[i];
c.a[i] = aux % 10;
tr = aux / 10;
}
while(tr)
{
c.a[++ c.a[0]] = tr % 10;
tr /= 10;
}
return c;
}
HugeN operator-(const HugeN& b)
{
int i , impr , aux;
HugeN c;
c.a[0] = a[0];
impr = 0;
for(i = 1 ; i <= c.a[0] ; i ++)
{
aux = a[i] - b.a[i] - impr;
if(aux < 0)
{
c.a[i] = aux + 10;
impr = 1;
}
else
{
c.a[i] = aux;
impr = 0;
}
}
while(!c.a[c.a[0]] && c.a[0] > 0)
c.a[0] --;
return c;
}
HugeN operator+(const HugeN& b)
{
int i , tr , aux;
HugeN c;
c.a[0] = max(a[0] , b.a[0]);
tr = 0;
for(i = 1 ; i <= c.a[0] ; i ++)
{
aux = a[i] + b.a[i] + tr;
c.a[i] = aux % 10;
tr = aux / 10;
}
if(tr)
c.a[++ c.a[0]] = tr;
return c;
}
void get_number()
{
for(int i = a[0] ; i >= 1 ; i --)
printf("%d" , a[i]);
}
};
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);
}
HugeN fast_pow(HugeN a , int p)
{
HugeN aa(1);
for( ; p ; p = (p >> 1))
{
if(p & 1)
aa = aa * a;
a = a * a;
}
return aa;
}
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;
HugeN sol , a(1) , b(2);
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &x);
desc(x);
}
pinex();
sol = fast_pow(b , n) - a;
for(i = 2 ; i <= NMAX ; i ++)
{
if(coef[i] == -1)
sol = sol + fast_pow(b , card(i)) - a;
else if(coef[i] == 1)
sol = sol - fast_pow(b , card(i)) + a;
}
sol.get_number();
return 0;
}