Cod sursa(job #1189390)

Utilizator apopeid15Apopei Daniel apopeid15 Data 22 mai 2014 18:12:52
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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,unu[200];
    unu[0]=unu[1]=1;
    freopen ("indep.in","r",stdin);
    freopen ("indep.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
        scanf("%d", &v[i]);
    for(i=1;i<N;++i)
    {
        l1=(i&1); l2=((i+1)&1);
        Adun(dp[l1][v[i]].v,unu);
        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);
        }
    }
    Adun(dp[(N&1)][v[N]].v,unu);
    N&=1;
    printf("%d", dp[N][1].v[dp[N][1].v[0]]);
    for(i=dp[N][1].v[0]-1;i>0;--i)
        printf("%.8d", dp[N][1].v[i]);
    printf("\n");
    return 0;
}