Cod sursa(job #2580499)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 13 martie 2020 18:09:27
Problema Indep Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
//
//  main.cpp
//  indep
//
//  Created by Eusebiu Rares on 13/03/2020.
//  Copyright © 2020 Eusebiu Rares. All rights reserved.
//

#include <iostream>
#include <algorithm>
#include <vector>

/*
 dp[i][j] = cate subsiruri din primele i numere au gcd j
 */

const int MV = 500 ;
const int MN = 1000 ;

FILE *in = fopen("indep.in", "r"), *out = fopen("indep.out", "w") ;

int v[MV + 1] ;

class BigInt {
private :
	std::vector<char> digits ;
	void reset() {
		digits.clear() ;
	}
public :
	BigInt() {
		digits.resize(0) ;
	}
	BigInt(int val) {
		do {
			digits.push_back((val % 10) + '0') ;
			val /= 10 ;
		} while (val) ;
	}
	BigInt operator = (int val) {
		reset() ;
		do {
			digits.push_back((val % 10) + '0') ;
			val /= 10 ;
		} while (val) ;
		return *this ;
	}
	BigInt operator + (BigInt aux) {
		BigInt ret ;
		int rest(0) ;
		
		for (int i = 0 ; i < aux.digits.size() && i < digits.size() ; ++ i) {
			ret.digits.push_back((((aux.digits[i] - '0') + (digits[i] - '0') + rest) % 10) + '0') ;
			rest = (aux.digits[i] - '0' + digits[i] - '0' + rest) / 10 ;
		}
		
		for (int i = (int)aux.digits.size() ; i < digits.size() ; ++ i) {
			ret.digits.push_back(((digits[i] - '0' + rest) % 10) + '0') ;
			rest = (digits[i] - '0' + rest) / 10 ;
		}
		
		for (int i = (int)digits.size() ; i < aux.digits.size() ; ++ i) {
			ret.digits.push_back(((aux.digits[i] - '0' + rest) % 10) + '0') ;
			rest = (aux.digits[i] - '0' + rest) / 10 ;
		}
		
		while (rest) {
			ret.digits.push_back(rest % 10) ;
			rest /= 10 ;
		}
		
		return ret ;
	}
	
	BigInt operator += (BigInt aux) {
		*this = *this + aux ;
		return *this ;
	}
	
	BigInt operator + (int aux) {
		BigInt rr(aux) ;
		return *this + rr ;
	}
	
	void display(bool type = 0) {
		if (type == 0) {
			for (int i = (int)digits.size() - 1 ; i >= 0 ; -- i) {
				fprintf(out, "%c", digits[i]) ;
			}
		} else {
			for (int i = (int)digits.size() - 1 ; i >= 0 ; -- i) {
				std::cout << digits[i] ;
			}
		}
	}
};

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

BigInt dp[MV + 1][MN + 1] ;

void comp(int num, int i) {
	for (int div = 1 ; div <= 1000 ; ++ div) {
		dp[i][gcd(div, num)] += dp[i - 1][div] ;
		dp[i][div] += dp[i - 1][div] ;
	}
	dp[i][num] = dp[i][num] + 1 ;
}

int main(int argc, const char * argv[]) {
	int n ;
	fscanf(in, "%d", &n) ;
	for (int i = 1 ; i <= n ; ++ i) {
		fscanf(in, "%d", v + i) ;
	}
	dp[1][v[1]] = 1 ;
	for (int i = 2 ; i <= n ; ++ i) {
		comp(v[i], i) ;
	}
	dp[n][1].display() ;
}