Cod sursa(job #1000698)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 23 septembrie 2013 16:52:35
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 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
folosim dinamica inainte :
dp[i+1][j] += dp[i][j] ,asta inseamna ca nu-l folosim pe a[i]
dp[i+1][cmmdc(j,a[i])] += dp[i][j] ,adica il adaugam pe a[i]
dp[i][a[i]] += 1,adica a[i] fomeaza singur un subsir
*/
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 <= 6; ++j)
        {
            Add(dp[Line^1][j],dp[Line][j]);
            Add(dp[Line^1][Cmmdc(j,x)],dp[Line][j]);
            if(i!=n || j!=1)
                for(;dp[Line][j][0];--dp[Line][j][0])
                    dp[Line][j][dp[Line][j][0]] = 0;
        }
    }
    freopen(Out,"w",stdout);
    Write(dp[n&1][1]);
    return 0;
}