Cod sursa(job #2123107)

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

int n;
int d[3][1005][1005];
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] / 10; A[i] %= 10;
    }
    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) d[l][1][0] = 1;
    for(int i = d[l][1][0]; i >= 1 ; --i)
        printf("%d", d[l][1][i]);
    return 0;
}