Pagini recente » Cod sursa (job #2199813) | Istoria paginii utilizator/belial | Cod sursa (job #2488162) | Cod sursa (job #1206444) | Cod sursa (job #1847871)
#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;
}