Cod sursa(job #1631584)

Utilizator lflorin29Florin Laiu lflorin29 Data 5 martie 2016 17:10:36
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <bits/stdc++.h>

using namespace std;

const int base = 1e7;

void Init(vector<int>&a, int x)
{
    a.clear();
    for(; x ; x /= base)
        a.push_back(x % base);
}

void adauga(vector<int> &a, vector<int> b) {
    a.resize(max(a.size(), b.size()));
    b.resize(max(a.size(), b.size()));
    int t = 0;
    for(int i = 0; i < (int)a.size(); ++i)
    {
        a[i] += b[i] + t;
        t = a[i] / base;
        a[i] %= base;
    }

    if(t) a.push_back(t);
}

void inmultire(vector<int>&a, int x)
{
    int t = 0;
    for(auto &val : a)
    {
        val = val * x + t;
        t = val / base;
        val %= base;
    }

    for(; t; t /= base)
        a.push_back(t % base);
}

void scadere(vector<int>&a , vector<int> b)
{
    b.resize(max(a.size(), b.size()));

    int t = 0;
    for(int i = 0 ; i < (int)a.size() ; ++i)
    {
        a[i] = a[i] - b[i] - t;
        if(a[i] < 0)
        {
            a[i] += base;
            t = 1;
        }

        else t = 0;

    }

    for(; a.size() > 1 && a[a.size() - 1] == 0 ; a.pop_back());
}

void afis(const vector<int>& a)
{
    printf("%d", a[a.size() - 1]);

    for(int i = a.size() - 2 ; i >= 0 ; --i)
        printf("%07d", a[i]);
    printf("\n");
}

inline int gcd(int a , int b)
{
    if(b == 0)
        return a ;
    return gcd(b , a % b);
}

int N;
vector<int>A;

void Read()
{
    freopen("indep.in", "r", stdin);
    scanf("%d", &N);
    A = vector<int>(N);
    for(int i = 0; i < N; ++i)
        scanf("%d", &A[i]);
}


void Solve()
{
    vector<int>rasp;
    Init(rasp, 1);
    for(int i = 0; i < N; ++i)
        inmultire(rasp , 2);

    vector<vector<int>>dp(N);

    for(int i = 0; i < N; ++i)
    {
        if(A[i] == 1)
           continue;
        Init(dp[i], 1);
        for(int j = i - 1 ; j >= 0 ; --j)
            if(gcd(A[i], A[j]) != 1)
               adauga(dp[i], dp[j]);
    }

    vector<int>nonPrimeCnt;
    for(int i = 0; i < N; ++i)
        adauga(nonPrimeCnt , dp[i]);
    scadere(rasp , nonPrimeCnt);
    scadere(rasp , vector<int>(1, 1));
    freopen("indep.out", "w", stdout);
    afis(rasp);
}
int main()
{
    Read();
    Solve();
}