Cod sursa(job #1847871)

Utilizator preda.andreiPreda Andrei preda.andrei Data 15 ianuarie 2017 10:36:02
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#include <vector>

using namespace std;

const int kMaxVal = 1000;

class Number
{
public:
    Number(int n)
    {
        init(n);
    }

    Number() : Number(0) {}

    int Digits() const { return digits.size() - 1; }

    Number& operator=(int n)
    {
        init(n);
        return *this;
    }

    bool operator!=(int n)
    {
        int pos = 1;
        do {
            if (n % 10 != digits[pos]) {
                return true;
            }
            n /= 10;
            ++pos;
        } while (n > 0);

        return pos <= Digits();
    }

    Number& operator+=(const Number &num);

    friend ostream& operator<<(ostream &o, const Number &num);

private:
    vector<int> digits;

    void init(int n)
    {
        digits.clear();
        digits.push_back(0);

        do {
            digits.push_back(n % 10);
            n /= 10;
        } while (n > 0);
        digits[0] = digits.size() - 1;
    }
};

Number& Number::operator+=(const Number &num)
{
    while (Digits() < num.Digits()) {
        digits.push_back(0);
        ++digits[0];
    }

    int ndig = Digits();
    int carry = 0;
    for (int i = 1; i <= ndig; ++i) {
        if (i <= num.Digits()) {
            digits[i] += num.digits[i];
        }
        digits[i] += carry;

        carry = digits[i] / 10;
        digits[i] %= 10;
    }

    if (carry > 0) {
        digits.push_back(carry);
        ++digits[0];
    }

    return *this;
}

ostream& operator<<(ostream &f, const Number &num)
{
    for (int i = num.digits.size() - 1; i > 0; --i) {
        f << num.digits[i];
    }
    return f;
}

int Cmmdc(int a, int b)
{
    while (b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return a;
}

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

    int n;
    fin >> n;

    vector<Number> d[2];
    d[0].resize(kMaxVal, Number(0));
    d[1].resize(kMaxVal, Number(0));

    for (int i = 0; i < n; ++i) {
        int ind = i % 2;
        int last = 1 - ind;

        int val;
        fin >> val;

        d[ind][val - 1] = 1;
        for (int j = 1; j <= kMaxVal; ++j) {
            if (d[last][j - 1] != 0) {
                d[ind][j - 1] += d[last][j - 1];
                d[ind][Cmmdc(j, val) - 1] += d[last][j - 1];
            }
        }

        for (auto &x : d[last]) {
            x = 0;
        }
    }

    fout << d[1 - n % 2][0] << "\n";
    return 0;
}