Cod sursa(job #1152455)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 24 martie 2014 19:01:18
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#define Nmax 505
#define Vmax 1005
#define Base 100000000

using namespace std;

int N,v[Nmax];

struct nr
{
    int v[200];
};
nr dp[2][Vmax+10];

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

inline void Adun(int a[], int b[])
{
    int k,i,x=0,rest=0;
    if(a[0]<b[0])
    {
        k=b[0];
        for(i=a[0]+1;i<=b[0];++i)
            a[i]=0;
    }
    else
    {
        k=a[0];
        for(i=b[0]+1;i<=a[0];++i)
            b[i]=0;
    }
    for(i=1;i<=k;++i)
    {
        x=a[i]+b[i]+rest;
        if(x>=Base)
        {
            rest=1;
            a[i]=x-Base;
        }
        else
        {
            rest=0;
            a[i]=x;
        }
    }
    a[0]=k;
    if(rest)
        a[++a[0]]=rest;
}

int main()
{
    int i,j,l1,l2;
    freopen ("indep.in","r",stdin);
    freopen ("indep.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
        scanf("%d", &v[i]);
    dp[1][v[1]].v[0]=dp[1][v[1]].v[1]=1;
    for(i=1;i<N;++i)
    {
        l1=(i&1); l2=((i+1)&1);
        for(j=1;j<=Vmax;++j)
        {
            dp[l2][j].v[0]=1;
            dp[l2][j].v[1]=0;
        }
        for(j=1;j<=Vmax;++j)
        {
            Adun(dp[l2][j].v,dp[l1][j].v);
            Adun(dp[l2][CMMDC(j,v[i+1])].v,dp[l1][j].v);
        }
    }
    N&=1;
    printf("%d", dp[N][1].v[dp[N][1].v[0]]);
    for(i=dp[N][1].v[0]-1;i;--i)
        printf("%.8d", dp[N][1].v[i]);
    printf("\n");
    return 0;
}