Cod sursa(job #2647505)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 5 septembrie 2020 00:09:53
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.03 kb
#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 = -1)
    {
        memset(a , 0 , sizeof(a));
        if(x != -1)
        {
            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] > 1)
            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) , aux1(0) , aux2(0);
    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)
            aux1 = aux1 + fast_pow(b , card(i)) - a;
        else if(coef[i] == 1)
            aux2 = aux2 + fast_pow(b , card(i)) - a;
    }
    sol = sol + aux1 - aux2;
    sol.get_number();
    return 0;
}