Cod sursa(job #2843590)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 2 februarie 2022 18:09:02
Problema Indep Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX(1005);
int v[NMAX], fr[NMAX], afis1[NMAX], rez[1005][1005], afis2[NMAX], ax[NMAX];

inline void add(int vec[NMAX], int care[NMAX])
{
    if(care[0] > vec[0])
        for(int i = vec[0] + 1; i <= care[0]; ++i)
            vec[++vec[0]] = 0;
    else
        for(int i = care[0] + 1; i <= vec[0]; ++i)
            care[++care[0]] = 0;

    int t = 0;
    for(int i = 1; i <= vec[0]; ++i)
    {
        vec[i] += care[i] + t;
        t = vec[i] / 10;
        vec[i] %= 10;
    }
    if(t)
        vec[++vec[0]] = t;
}

inline void scade(int vec[NMAX], int care[NMAX])
{
    int t = 0;
    for(int i = care[0] + 1; i <= vec[0]; ++i)
        care[i] = 0;
    for(int i = 1; i <= vec[0]; ++i)
    {
        vec[i] = vec[i] - care[i] - t;
        if(vec[i] < 0)
            vec[i] += 10, t = 1;
        else t = 0;
    }
    while(!vec[vec[0]])
        --vec[0];
}

int main()
{
    int n;
    fin >> n;

    for(int i = 1; i <= n; ++i)
        fin >> v[i];

    rez[0][0] = rez[0][1] = ax[0] = ax[1] = 1;
    for(int put = 1; put <= 1000; ++put)
    {
        for(int i = 1; i <= rez[put - 1][0]; ++i)
            rez[put][i] = rez[put - 1][i];
        rez[put][0] = rez[put - 1][0];
        int t = 0;
        for(int i = 1; i <= rez[put][0]; ++i)
        {
            t = rez[put][i] * 2 + t;
            rez[put][i] = t % 10;
            t /= 10;
        }
        while(t)
            rez[put][++rez[put][0]] = t % 10, t /= 10;
    }

    for(int x = 1; x <= 1000; ++x)
        scade(rez[x], ax);

    for(int x = 1; x <= 1000; ++x)
        for(int i = 1; i <= n; ++i)
            if(x <= v[i] && v[i] % x == 0)
                ++fr[x];
    afis1[0] = afis2[0] = 1;
    for(int x = 2; x <= 1000; ++x)
        if(fr[x])
        {
            int d = 2;
            int cx = x;
            int cnt = 0;
            bool ok = 1;
            while(cx != 1)
            {
                int exp = 0;
                while(cx % d == 0)
                    cx /= d, ++exp;
                if(exp)
                {
                    if(exp > 1)
                    {
                        ok = 0;
                        break;
                    }
                    ++cnt;
                }
                ++d;
            }
            if(ok)
            {
                if(cnt % 2 == 1)
                    add(afis1, rez[fr[x]]);
                else add(afis2, rez[fr[x]]);
            }
        }

    add(afis2, rez[fr[1]]);
    scade(afis2, afis1);
    for(int i = afis2[0]; i >= 1; --i)
        fout << afis2[i];
    return 0;
}