Cod sursa(job #3189980)

Utilizator Allie28Radu Alesia Allie28 Data 6 ianuarie 2024 18:49:16
Problema Indep Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");

const int LMAX = 505;

int dp[2][2*LMAX][170];
void sum(int b[], int c[]) {
    //b = b + c
    b[0] = max(b[0], c[0]);
    int r = 0;
    for (int i = 1; i <= b[0]; i++) {
        b[i] = (b[i] + c[i] + r)%10;
        r = (b[i] + c[i] + r)/10;
    }
    if (r) {
        b[0]++;
        b[b[0]] = 1;
    }
}
void afis(int b[]) {
    for (int i = b[0]; i >= 1; i--) {
        fout<<b[i];
    }
}
//dp[i][j] nr de subsecvente cu primele i elemenete care au cmmdc j
int cmmdc(int a, int b) {
    int r;
    while (b) {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}

int main() {
    int n, i, j, nrelem, x;
    fin>>n;
    for (i = 1; i <= n; i++) {
        fin>>x;
        nrelem = i%2;
        for (j = 1; j <= 1000; j++) {
            ///nu adaugam al i ulea element
            sum(dp[nrelem][j],dp[1-nrelem][j]);
            ///adaugam al i ulea element
            sum(dp[nrelem][cmmdc(x, j)],dp[1-nrelem][j]); ///pt ca la fiecare subsecv de cmmdc j fac cmmdc cu a[i]
        }
        ///fac o noua secv cu a[i]
        int aux[] = {1, 1};
        sum(dp[nrelem][x],aux);
    }
    afis(dp[n%2][1]);

    fin.close();
    fout.close();
    return 0;
}