Cod sursa(job #1000703)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 23 septembrie 2013 16:58:51
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>

#define Base 1000000000
#define In "indep.in"
#define Out "indep.out"
#define ValMax 1000

using namespace std ;
///calculam dp[i][j] = numarul de subsiruri formate din primele i elemente cu cmmdc = j

int dp[2][1005][1005], a[1005];
inline 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;
}

inline int Cmmdc(int x, int y)
{
    int r;
    while (y)
    {
        r = x%y;
        x = y;
        y = r;
    }
    return x;
}

inline void Write(int a[])
{
    printf("%d",a[a[0]]);
    for(int i = a[0]-1; i > 0;--i)
        printf("%09d",a[i]);
    printf("\n");
}

int main()
{
    ifstream f(In);
    int i,Line, n, x, j;
    f >> n;
    a[0] = a[1] = 1;
    for(i = Line = 1;i <= n; ++i,Line ^= 1)
    {
        f >> x;
        Add(dp[Line][x],a);
        for(j = 1;j <= ValMax; ++j)
        {
            Add(dp[Line][j],dp[Line^1][j]);
            Add(dp[Line][Cmmdc(j,x)],dp[Line^1][j]);
            if(i!=n || j!=1)
                for(;dp[Line^1][j][0];--dp[Line^1][j][0])
                    dp[Line^1][j][dp[Line^1][j][0]] = 0;
        }
    }
    freopen(Out,"w",stdout);
    Write(dp[n&1][1]);
    return 0;
}