Cod sursa(job #2515078)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 27 decembrie 2019 19:05:33
Problema Indep Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <fstream>

using namespace std;

ifstream fin("indep.in");
ofstream fout("indep.out");

int n,i,j,v[505],p2[505][505],w[1005],fact[1005];
int unu[10],sol[505];

void adun(int A[], int B[], int C[])
{
    int t = 0;
    for (int i=1; i<=max(A[0], B[0]); i++)
    {
        C[i] = A[i]+B[i]+t;
        t = C[i]/10;
        C[i] %= 10;
    }
    C[0] = max(A[0], B[0]);
    if (t)
        C[++C[0]] = t;
}

void inmult(int A[], int b, int C[])
{
    int t = 0;
    for (int 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 scad(int A[], int B[], int C[])
{
    int t = 0;
    for (int i=B[0]+1; i<=A[0]; i++)
        B[i] = 0;
    for (int i=1; i<=A[0]; i++)
    {
        C[i] = A[i]-B[i]-t;
        if (C[i] < 0)
            t = 1;
        else
            t = 0;
        if (t)
            C[i] += 10;
    }
    C[0] = A[0];
    while (!C[C[0]] && C[0] > 0)
        C[0]--;
}

int main()
{
    fin >> n; int maxim = 0;
    for (i=1; i<=n; i++)
    {
        fin >> v[i];
        maxim = max(maxim, v[i]);
    }
    p2[0][0] = p2[0][1] = 1; int k = 0;
    for (i=1; i<=n; i++)
        inmult(p2[i-1], 2, p2[i]);
    unu[0] = 1; unu[1] = 1;
    for (i=0; i<=n; i++)
        scad(p2[i], unu, p2[i]);
    for (i=2; i<=maxim; i++)
    {
        int val = i; int ok = 0; int nrfact = 0;
        for (int d=2; d*d<=val; d++)
            if (val%d == 0)
            {
                int exponent = 0;
                while (val%d == 0)
                {
                    exponent++;
                    val /= d;
                }
                if (exponent >= 2)
                {
                    ok = 1;
                    break;
                }
                nrfact++;
            }
        if (val != 1)
            nrfact++;
        if (ok == 0)
        {
            w[++k] = i;
            fact[k] = nrfact;
        }
    }
    for (i=0; i<=p2[n][0]; i++)
        sol[i] = p2[n][i];
    for (i=1; i<=k; i++)
    {
        int nr = 0;
        for (j=1; j<=n; j++)
            if (v[j]%w[i] == 0)
                nr++;
        if (fact[i]%2 == 1)
            scad(sol, p2[nr], sol);
        else
            adun(sol, p2[nr], sol);
    }
    for (i=sol[0]; i>=1; i--)
        fout << sol[i];
    return 0;
}