Cod sursa(job #975243)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 19 iulie 2013 15:07:08
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <cstring>
#include <iomanip>
#define NM 510
#define VM 1010
#define CM 50
#define BASE 100000

using namespace std;

ifstream f("indep.in");
ofstream g("indep.out");

inline int cmmdc (int a, int b)
{
    int r;
    while (b)
    {
        r=a%b;
        a=b;
        b=r;
    }

    return a;
}

int N, i, j, MAXV;
int A[NM];
int DP[2][VM][CM];
int One[CM];

void Add (int A[CM], int B[CM])
{
    A[0]=max(A[0], B[0]);

    int i, T=0;

    for (i=1; i<=A[0]; i++)
    {
        T+=A[i]+B[i];
        A[i]=T%BASE;
        T/=BASE;
    }

    for (; T>0; T/=BASE)
        A[++A[0]]=T%BASE;
}

void Print (int A[CM])
{
    g << A[A[0]];

    for (int i=A[0]-1; i>=1; i--)
        g << setfill('0') << setw(5) << A[i];

    g << '\n';
}

int main ()
{
    f >> N;
    for (i=1; i<=N; i++)
    {
        f >> A[i];
        MAXV=max(MAXV, A[i]);
    }

    One[0]=One[1]=1;

    for (i=1; i<=N; i++)
    {
        int C=i%2, P=1-C;

        memset(DP[C], 0, sizeof(DP[C]));

        Add(DP[C][A[i]], One);

        for (j=1; j<=MAXV; j++)
        {
            Add(DP[C][j], DP[P][j]);
            Add(DP[C][cmmdc(A[i], j)], DP[P][j]);
        }
    }

    Print(DP[N%2][1]);

    f.close();
    g.close();

    return 0;
}