Cod sursa(job #2647501)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 4 septembrie 2020 23:31:03
Problema Indep Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#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;
}