Cod sursa(job #1472664)

Utilizator akaprosAna Kapros akapros Data 17 august 2015 15:14:10
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 500
#define maxL 1000
#define base 1000000000
#define ct 9
using namespace std;
int n, x, i, j, k, v[maxN], w[maxN];
int dp[2][maxN * 2 + 2][maxL];
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 gcd(int d, int i)
{
    int r;
    if (d < i)
        swap(d, i);
    r = d % i;
    while (r)
        d = i,
            i = r,
                r = d % i;
    return i;
}
void read()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    scanf("%d", &n);
    w[++ w[0]] = 1;
    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &v[i]);
        add(dp[i & 1][v[i]], w);
        for (j = 1; j <= maxL; ++ j)
        {
            k = gcd(j, v[i]);
            add(dp[i & 1][k], dp[(i - 1) & 1][j]);
            add(dp[i & 1][j], dp[(i - 1) & 1][j]);
        }
        memset(dp[(i - 1) & 1], 0, sizeof(dp[(i - 1) & 1]));
    }
}
void write()
{
    int x, Pow;
    freopen("indep.out", "w", stdout);
    n &= 1;
    printf("%d", dp[n][1][dp[n][1][0]]);
    for (i = dp[n][1][0] - 1; i >= 1; -- i)
    {
        x = 1; Pow = 0;
        while (dp[n][1][i] > x)
            x *= 10,
               ++ Pow;
        for (i = Pow + 1; i <= ct; ++ i)
            printf("0");
        printf("%d", dp[n][1][i]);
    }
}
int main()
{
    read();
    write();
    return 0;
}