Cod sursa(job #2123113)

Utilizator giotoPopescu Ioan gioto Data 5 februarie 2018 20:17:34
Problema Indep Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n;
int d[3][1005][1005];
const int MOD = 1000000000;
inline void Add(int A[], int B[]){
    A[0] = max(A[0], B[0]);
    int t = 0;
    for(int i = 1; i <= A[0] ; ++i){
        A[i] = A[i] + B[i] + t;
        t = A[i] / MOD; A[i] %= MOD;
    }
    if(t > 0) A[++A[0]] = t;
}
inline int cmmdc(int x, int y){
    while(y > 0){
        int r = x % y;
        x = y; y = r;
    }
    return x;
}
int main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    scanf("%d", &n);
    int x;
    scanf("%d", &x);
    d[1][x][0] = 1; d[1][x][1] = 1;
    int l = 1;
    for(int i = 2; i <= n ; ++i){
        scanf("%d", &x);
        l = 1 - l;
        memset(d[l], 0, sizeof(d[l]));
        d[l][x][0] = 1; d[l][x][1] = 1;
        for(int j = 1; j <= 1000 ; ++j)
            Add(d[l][cmmdc(x, j)], d[1 - l][j]);
        for(int j = 1; j <= 1000 ; ++j)
            Add(d[l][j], d[1 - l][j]);
    }
    if(d[l][1][0] == 0){
        printf("0");
        return 0;
    }
    printf("%d", d[l][1][d[l][1][0]]);
    for(int i = d[l][1][0] - 1; i >= 1 ; --i){
        int aux = d[l][1][i];
        while(aux < MOD / 10) printf("0"), aux *= 10;
        printf("%d", d[l][1][i]);
    }
    return 0;
}