Cod sursa(job #2310599)

Utilizator akaprosAna Kapros akapros Data 1 ianuarie 2019 17:35:44
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
#define maxV 1001
#define maxL 101
#define base 1000000000
#define ll long long

FILE *fin = freopen("indep.in", "r", stdin);
FILE *fout = freopen("indep.out", "w", stdout);

int dp[2][maxV][maxL];
int gcd(int x, int y)
{
    int r = x % y;
    while (r)
    {
        x = y;
        y = r;
        r = x % y;
    }
    return y;
}
void add(int A[], int B[])
{
    int i, t = 0;
    for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base)
        A[i] = (t += A[i] + B[i]) % base;
    A[0] = i - 1;
}
int main()
{
    int n, *v;
    scanf("%d", &n);
    v = new int[n + 1];
    for (int i = 0; i < n; ++ i)
        scanf("%d", &v[i]);

    int one[maxL];
    memset(one, 0, sizeof(one));
    one[++ one[0]] = 1;

    add(dp[0][v[0]], one);
    for (int i = 1, t = 1; i < n; ++ i, t = !t)
    {
        memset(dp[t], 0, sizeof(dp[t]));
        for (int d1 = 1; d1 < maxV; ++ d1)
        {
            int d2 = gcd(d1, v[i]);
            add(dp[t][d2], dp[!t][d1]); /// d2 <= d1
            add(dp[t][d1], dp[!t][d1]);
        }
        add(dp[t][v[i]], one);
    }
    int sz = dp[!(n & 1)][1][0];
    printf("%d", dp[!(n & 1)][1][sz]);
    for (int i = sz - 1; i >= 1; -- i)
    {
        int x = dp[!(n & 1)][1][i];
        if (x < 10) printf("00000000%d", x);
        else if (x < 100) printf("0000000%d", x);
        else if (x < 1000) printf("000000%d", x);
        else if (x < 10000)
            printf("00000%d", x);
        else if (x < 100000)
            printf("0000%d", x);
        else if (x < 1000000)
            printf("000%d", x);
        else if (x < 10000000)
            printf("00%d", x);
        else if (x < 100000000)
            printf("0%d", x);
        else
            printf("%d", x);
    }
    return 0;
}