Cod sursa(job #2926420)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 17 octombrie 2022 19:19:05
Problema Indep Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX_N = 505;
const int MAX_V = 1005;
int n, m, v[MAX_N];

struct MARE{
    int digit[170];

    inline void add_SCALAR(int val){
        int t = val;
        for(int i=1; i<=digit[0]; i++){
            digit[i] += t;
            t = digit[i] / 10;
            digit[i] %= 10;
        }

        while(t){
            digit[++digit[0]] = t%10;
            t /= 10;
        }
    }

    inline void add_MARE(const MARE &rhs){
        digit[0] = max(digit[0], rhs.digit[0]);

        int t = 0;
        for(int i=1; i<=digit[0]; i++){
            digit[i] += rhs.digit[i] + t;
            t = digit[i] / 10;
            digit[i] %= 10;
        }

        while(t){
            digit[++digit[0]] = t%10;
            t /= 10;
        }
    }

    inline void output(){
        for(int i=digit[0]; i>=1; i--)
            fout<<digit[i];
    }
} dp[MAX_N][MAX_V];

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n;
    for(int i=1; i<=n; i++){
        fin>>v[i];
        m = max(m, v[i]);
    }

    for(int i=1; i<=n; i++){

        for(int j=i+1; j<=n+1; j++)
            dp[j][v[i]].add_SCALAR(1);

        for(int cmmdc=1, nxt_cmmdc; cmmdc<=m; cmmdc++)
            if(dp[i][cmmdc].digit[0] != 0){
                nxt_cmmdc = __gcd(cmmdc, v[i]);
                for(int j=i+1; j<=n+1; j++)
                    dp[j][nxt_cmmdc].add_MARE(dp[i][cmmdc]);
            }
    }
    dp[n+1][1].output();
    return 0;
}
/**
4
3 4 2 6

  3 1 1
    4 2
      2
      4
**/