Cod sursa(job #1016102)

Utilizator andreiiiiPopa Andrei andreiiii Data 25 octombrie 2013 19:03:37
Problema Indep Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstring>
#define N 1001
#define Base 10000000
using namespace std;

int dp[2][N][N], nr1[N];

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 cmmdc(int a, int b)
{
    int c;
    while (b) {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

int main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    int n, i, j, x, sign=1;
    nr1[0]=nr1[1]=1;
    scanf("%d", &n);
    for(i=1;i<=n;i++, sign=!sign)
    {
        scanf("%d", &x);
        add(dp[sign][x], nr1);
        for(j=1;j<N;j++)
        {
            add(dp[sign][j], dp[!sign][j]);
            add(dp[sign][cmmdc(j, x)], dp[!sign][j]);
        }
        memset(dp[!sign], 0, sizeof(dp[!sign]));
    }
    sign=n%2;
    printf("%d", dp[sign][1][dp[sign][1][0]]);
    for(i=dp[sign][1][0]-1;i>0;i--)
    {
        printf("%d", dp[sign][1][i]);
    }
}