Cod sursa(job #1234709)

Utilizator vladrochianVlad Rochian vladrochian Data 27 septembrie 2014 21:09:31
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
const int NMAX = 505, GCDMAX = 1000;

class LargeInt {
	private:
	static const long long base = 1000000000000000000;
	long long digit[9];
	int size;
	public:
	LargeInt() {
		size = 1;
		digit[0] = 0;
	}
	void operator=(int x) {
		size = 1;
		digit[0] = x;
	}
	void operator+=(const LargeInt &other) {
		if (other.size > size) {
			memset(digit + size, 0, (other.size - size) << 2);
			size = other.size;
		}
		int rest, i;
		for (rest = 0, i = 0; i < other.size; ++i) {
			digit[i] += other.digit[i] + rest;
			rest = digit[i] / base;
			digit[i] %= base;
		}
		while (rest) {
			if (i == size)
				digit[size++] = 0;
			digit[i] += rest;
			rest = digit[i] / base;
			digit[i] %= base;
			++i;
		}
	}
	void print(ostream &os) {
		for (int i = size - 1; i >= 0; --i)
			os << digit[i] << setfill('0') << setw(18);
	}
} dp[NMAX][GCDMAX];
int N, a[NMAX];

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

int Cmmdc(const int a, const int b) {
	if (!b)
		return a;
	return Cmmdc(b, a % b);
}

int main() {
	fin >> N;
	for (int i = 1; i <= N; ++i) {
		fin >> a[i];
		dp[i][a[i]] = 1;
		for (int j = 1; j < GCDMAX; ++j) {
			dp[i][Cmmdc(j, a[i])] += dp[i - 1][j];
			dp[i][j] += dp[i - 1][j];
		}
	}
	dp[N][1].print(fout);
	return 0;
}