Cod sursa(job #2764754)

Utilizator DragosC1Dragos DragosC1 Data 22 iulie 2021 13:49:34
Problema Indep Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <iostream>
using namespace std;
 
int baza = 1000000;
 
typedef int bigNr[151];
int a[501], n;
 
void read() {
    int i;
    ifstream f("indep.in");
    f >> n;
    for (i = 1; i <= n; i++)
        f >> a[i];
    f.close();
}

bigNr dp[2][1001];

int euclid(int a, int b) {
    if (b == 0)
        return a;
    else return euclid(b, a % b);
}
 
void solve() {
    int i, j, k, cmmdc, t;
    dp[0][0][++dp[0][0][0]] = 1;
    for (i = 1; i <= n; i++) {
        for (j = 0; j <= 1000; j++) {
            dp[i % 2][j][0] = dp[1 - i % 2][j][0];
            for (k = dp[i % 2][j][0]; k >= 1; k--)
                dp[i % 2][j][k] = dp[1 - i % 2][j][k];
        }
        for (j = 0; j <= 1000; j++) {
            cmmdc = euclid(j, a[i]);
            dp[i % 2][cmmdc][0] = max(dp[i % 2][cmmdc][0], dp[1 - i % 2][j][0]);
            t = 0;
            for (k = 1; k <= dp[i % 2][cmmdc][0]; k++) {
                t += dp[i % 2][cmmdc][k] + dp[1 - i % 2][j][k];
                dp[i % 2][cmmdc][k] = t % baza;
                t /= baza;
            }
            while (t) {
                dp[i % 2][cmmdc][++dp[i % 2][cmmdc][0]] = t % baza;
                t /= baza;
            }
        }
    }
}
 
void output() {
    int i, x;
    ofstream g("indep.out");
    g << dp[n % 2][1][dp[n % 2][1][0]];
    for (i = dp[n % 2][1][0] - 1; i >= 1; i--) {
        x = dp[n % 2][1][i];
        if (x < 10)
            g << "00";
        else if (x < 100)
            g << "0";
        g << x;
    }
    g.close();
}   
 
int main() {
    read();
    solve();
    output();
    return 0;
}