Pagini recente » Cod sursa (job #904704) | Cod sursa (job #1386673) | Cod sursa (job #1518676) | Cod sursa (job #3158480) | Cod sursa (job #2580499)
//
// 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() ;
}