Cod sursa(job #1637089)

Utilizator gapdanPopescu George gapdan Data 7 martie 2016 14:52:09
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cstring>
#define NMAX 1001
#define max(a,b) (a>b?a:b)
#define MOD 1000000000

using namespace std;

int n,M,i,c,j;
int a[NMAX];
unsigned int vec1[2*NMAX];
int mat[NMAX][NMAX];
unsigned int cnt[NMAX][2*NMAX];

int cmmdc(int a,int b)
{
    int r=0;
    while(a>0)
    {
        r=b%a;
        b=a;
        a=r;
    }
    return b;
}

int lg,ok;
void aduna(unsigned int C[],unsigned int A[])
{
    int i,t=0;
    lg=max(A[0],C[0]);
    C[0]=lg;
    for(i=1;i<=lg;++i)
    {
        int aux=C[i];
        C[i] = (A[i] + aux + t);
        if(C[i] > MOD) C[i]-=MOD;
        t=(A[i]+aux+t) / MOD;
    }
}

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        M=max(a[i],M);
    }
    cnt[a[1]][0]=1;cnt[a[1]][1]=1;
    vec1[0]=1;vec1[1]=1;
    for(i=2;i<=n;++i)
    {
        for(j=1;j<=M;++j)
            {

                if(mat[j][a[i]] != 0) c=mat[j][a[i]];
                    else
                    {
                        c=cmmdc(j,a[i]);
                        mat[j][a[i]]=c;
                        mat[a[i]][j]=c;
                    }
                if(cnt[j][0]) aduna(cnt[c],cnt[j]);
            }
        aduna(cnt[a[i]],vec1);
    }

    lg=cnt[1][0];
    for(i=lg;i>=1;--i)
        printf("%d",cnt[1][i]);
    if(lg == 0) printf("0\n");
    return 0;
}