Cod sursa(job #2710819)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 23 februarie 2021 09:31:09
Problema Indep Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 505;
int n, v[nmax], dp[2][1005][505];

void aduna(int *a, int *b){
    int t = 0;
    for (int i = 1; i <= max(a[0], b[0]); ++i){
        if (i > a[0]) a[i] = 0;
        if (i > b[0]) b[i] = 0;
        a[i] = a[i] + b[i] + t;
        t = a[i] / 10000;
        a[i] %= 10000;
    }
    a[0] = max(a[0], b[0]);
    if (t){
        a[++a[0]] = t;
    }
}

int main(){
    fin >> n;
    for (int i = 1; i <= n; ++i){
        fin >> v[i];
    }
    int t = 0;
    dp[1 - t][1][0] = dp[1 - t][1][1] = 1;
    for (int i = n; i >= 1; --i){
        for (int j = 0; j <= 1000; ++j){
            for (int k = dp[1 - t][j][0]; k >= 0; --k){
                dp[t][j][k] = dp[1 - t][j][k];
            }
        }
        for (int j = 0; j <= 1000; ++j){
            aduna(dp[t][j], dp[1 - t][__gcd(j, v[i])]);
        }
        t = 1 - t;
    }
    t = 1 - t;
    for (int i = dp[t][0][0]; i >= 1; --i){
        if (i != dp[t][0][0]){
            if (dp[t][0][i] <= 9){
                fout << 000;
            }
            else if (dp[t][0][i] <= 99){
                fout << 00;
            }
            else if (dp[t][0][i] <= 999){
                fout << 0;
            }
        }
        fout << dp[t][0][i];
    }
    fin.close();
    fout.close();
    return 0;
}