Cod sursa(job #3154725)

Utilizator catalinmarincatalinmarin catalinmarin Data 5 octombrie 2023 19:03:38
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("indep.in");
ofstream cout("indep.out");
long long euclid(long long a, long long b){
    if (b == 0)
        return a;
    long long rezultat = euclid(b, a % b);
    return rezultat;
}
void add(int A[], int B[]){
    int i, t = 0;
    for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
        A[i] = (t += A[i] + B[i]) % 10;
    A[0] = i - 1;
}
int main(){
    int lungime;
    int max_nr[501] = {0};
    int v[1001] = {0};
    int dp[2][1001][1001] = {0};
    cin >> lungime;
    for (int i = 1; i <= lungime; i++){
        cin >> v[i];
        max_nr[i] = max(max_nr[i - 1], v[i]);
    }
    for (int i = 1; i <= lungime; i++){
        int curr_i = i % 2;
        for (int j = 0; j <= max_nr[i]; j++){
            for (int k = 1; k <= dp[curr_i][j][0]; k++)
                dp[curr_i][j][k] = 0;
            dp[curr_i][j][0] = 1;
        }
        int last_i = (i - 1) % 2;
        for (int j = 1; j <= max_nr[i]; j++){
            int k = euclid(v[i], j);
            add(dp[curr_i][j], dp[last_i][j]);
            add(dp[curr_i][k], dp[last_i][j]);
            if (j == v[i]){
                int mat[1001] = {0};
                mat[0] = 1;
                mat[1] = 1;
                add(dp[curr_i][j], mat);
            }
        }
    }
    for (int i = 1; i <= dp[lungime % 2][1][0]; i++){
        cout << dp[lungime % 2][1][i];
    }
    return 0;
}