Cod sursa(job #1000306)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 22 septembrie 2013 17:10:35
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define NMax 510
#define ValMax 1010

using namespace std;

int n, a[NMax], maxim;
int dp[2][ValMax];

inline void Read()
{
    ifstream f ("indep.in");
    f>>n;
    int i;
    for (i=1; i<=n; ++i)
        f>>a[i], maxim = max(maxim, a[i]);
    f.close();
}

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

inline void Solve()
{
    /// dp[i][j] = numarul de subsiruri existente folosind elemente din primele i cu cmmdc = j
    /// dp[i][j] -> dp[i+1][j]

    int i, p, q, j;
    for (i=1, p=1, q=0; i<=n; ++i, swap(p, q))
    {
        dp[p][a[i]] = 1;
        for (j=1; j<=maxim; ++j)
        {
            dp[p][j] += dp[q][j];
            dp[p][cmmdc(j, a[i])] += dp[q][j];
        }
        memset(dp[q], 0, sizeof(dp[q]));
    }
    ofstream g ("indep.out");
    g<<dp[q][1]<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}