Cod sursa(job #2735204)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 1 aprilie 2021 23:11:56
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
#define f in
#define g out

using namespace std;
ifstream in ( "indep.in" );
ofstream out( "indep.out" );

void adunare ( int a[], int b[], int c[] ){
    int t = 0, i; c[0] = max ( a[0], b[0] );
    for ( i=1; i <= c[0]; i++){
        c[i] = a[i] + b[i] + t;
        t = c[i]/10;
        c[i] %= 10;
    }
    if ( t )
        c[++c[0]] = t;
}

void inmultire ( int a[], int b, int c[] ){
    int t = 0, i;
    for ( i=1; i <= a[0]; i++ ){
        c[i] = a[i]*b + t;
        t = c[i]/10;
        c[i] %= 10;
    }
    c[0] = a[0];
    while (t) {
        c[++c[0]] = t%10;
        t /= 10;
    }
}

void scadere ( int a[], int b[] ){
    int i, t = 0;
    for ( i = b[0]+1; i <= a[0]; i++ )
        b[i] = 0;
    for ( i=1; i <= a[0]; i++ ){
        a[i] = a[i]-b[i]-t;
        if ( a[i] < 0 ){
            a[i] += 10;
            t = 1;
        } else t = 0;
    }
    while ( !a[a[0]] )
        a[0]--;
}

int n, i, maxi, j, ok, nr, d, k, e, p;
int v[550], putere[550][550], p2[550], sump[550], summ[550], x[1100], y[1100];


int main() {
    f>>n;
    for ( i=1; i <= n; i++ ){
        f>>v[i];
        maxi = max ( maxi, v[i] );
    }
    p2[0] = 1; p2[1] = 2;
    putere[1][0] = 1; putere[1][1] = 1;
    sump[0] = summ[0] = 1;
    sump[1] = summ[1] = 0;
    
    for ( i=2; i <= n; i++ ){
        adunare(putere[i-1], p2, putere[i] );
        inmultire(p2, 2, p2);
    }
    
    for ( i=2; i <= maxi; i++ ){
        
        ok = 1;
        nr = 0;
        
        k = i;
        d = 2;
        while ( k != 1 ){
            e = 0;
            while ( k%d == 0 ){
                e++;
                k /= d;
            }
            if ( e >= 2 )
                ok = 0;
            if ( e == 1 )
                nr++;
            d++;
        }
        
        if ( ok ){
            x[++p] = i;
            y[p] = nr;
        }
    }
    
    for ( i=1; i <= p; i++ ){
        nr = 0;
        for ( j = 1; j <= n; j++ )
            if ( v[j]%x[i] == 0 )
                nr++;
        if ( y[i]%2 == 1 )
            adunare(sump, putere[nr], sump);
        else adunare(summ, putere[nr], summ);
    }
    
    scadere(sump, summ);
    scadere(putere[n], sump);
    
    if ( putere[n][0] <= 0 )
        g<<0;
    for ( i = putere[n][0]; i >= 1; i-- )
        g<<putere[n][i];
    
    return 0;
}