Cod sursa(job #2257205)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 9 octombrie 2018 20:17:57
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <vector>
#define VAL 505
#define NRV 1005
#define BASE 1000000000

using namespace std;

ifstream fin("indep.in");
ofstream fout("indep.out");

int N, v[VAL], i, j;
int dp[2][NRV][NRV], D;
int cif[15], X;
int sol[NRV][NRV];

void ADD(int cnt, int X)
{
    int i, t=0, nr;
    for (i=1; i<=max(dp[cnt][D][0], dp[1-cnt][X][0]); i++)
    {
        nr=0;
        if (i<=dp[cnt][D][0])
            nr+=dp[cnt][D][i];
        if (i<=dp[1-cnt][X][0])
            nr+=dp[1-cnt][X][i];
        nr+=t;
        t=nr / BASE;
        nr=nr % BASE;
        dp[cnt][D][i]=nr;
    }
    if (t==1)
        dp[cnt][D][++dp[cnt][D][0]]=1;
}

void EMPTY(int cnt)
{
    for (int j=1; j<NRV; j++)
    {
        dp[cnt][j][0]=1;
        dp[cnt][j][1]=0;
    }
}

int GCD(int A, int B)
{
    if (B==0)
        return A;
    return GCD(B, A % B);
}

int main()
{
    fin >> N;
    for (i=1; i<=N; i++)
        fin >> v[i];
    EMPTY(0);
    EMPTY(1);
    dp[1][v[1]][0]=dp[1][v[1]][1]=1;
    sol[1][v[1]]=1;
    for (i=2; i<=N; i++)
    {
        sol[i][v[i]]=1;
        for (j=1; j<NRV; j++)
        {
            D=GCD(v[i], j);
            //ADD(i % 2, j);
            //ADD(i % 2 , D);
            sol[i][D]+=sol[i-1][j];
        }
        for (j=1; j<NRV; j++)
            sol[i][j]+=sol[i-1][j];
        EMPTY((i+1) % 2);
    }
    fout << sol[N][1] << '\n';
   /* for (i=dp[N % 2][1][0]; i>=1; i--)
    {
        if (i==dp[N % 2][1][0])
            fout << dp[N % 2][1][i];
        else
        {
            X=BASE / 10;
            for (int j=1; j<=9; j++)
            {
                cif[j]=dp[N % 2][1][i] / X;
                dp[N % 2][1][i]%=X;
                X/=10;
            }
            for (j=1; j<=9; j++)
                fout << cif[j];
        }
    }*/
    /*fout << '\n';
    for (i=1; i<=N; i++)
    {
        for (j=1; j<=6; j++)
        {
            fout << i << " " << j << " " << sol[i][j] << '\n';
        }
    }*/
    fin.close();
    fout.close();
    return 0;
}