Cod sursa(job #1232755)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 23 septembrie 2014 20:52:48
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstdio>
#define BASE 10000
using namespace std;
ifstream f("indep.in");
int N,Array[505];
int DP1[1005][105],DP2[1005][105];
int cmmdc[1005][1005];
void Read()
{
    int i;
    f>>N;
    for(i=1;i<=N;i++)
        f>>Array[i];
}

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;
}
int CMMDC(int a,int b)
{
    int rest=a%b;
    while(rest!=0)
    {
        a=b;
        b=rest;
        rest=a%b;
    }
    return b;
}
void precalcCMMDC()
{
    int i,j;
    for(i=1;i<=1000;i++)
        for(j=1;j<=1000;j++)
            if(cmmdc[i][j]==0)
                cmmdc[i][j]=cmmdc[j][i]=CMMDC(i,j);
}
void solveDinamic()
{
    int i,j;
    DP1[Array[1]][0]=1;
    DP1[Array[1]][1]=1;
    for(i=2;i<=N;i++)
    {
        for(int l=1;l<=1000;l++)
        {
            for(int k=1;k<=DP2[l][0];k++)
                DP2[l][k]=0;
            DP2[l][0]=1;
        }
        DP2[Array[i]][1]=1;
        for(j=1;j<=1000;j++)
        {
            add(DP2[j],DP1[j]);
            add(DP2[cmmdc[Array[i]][j]],DP1[j]);
        }
        for(int l=1;l<=1000;l++)
        {
            DP1[l][0]=DP2[l][0];
            for(int k=1;k<=DP2[l][0];k++)
                DP1[l][k]=DP2[l][k];
        }


    }


}
void Print()
{
    int i;
    printf("%d",DP1[1][DP1[1][0]]);
    for(int i=DP1[1][0]-1;i>=1;i--)
        printf("%04d",DP1[1][i]);
}
int main()
{
    freopen("indep.out","w",stdout);
    Read();
    precalcCMMDC();
    solveDinamic();
    Print();
    return 0;
}