Cod sursa(job #1657500)

Utilizator SilviuIIon Silviu SilviuI Data 20 martie 2016 15:35:38
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

struct bigint
{
    int t[100];
    bigint()
    {
        for (int i=0;i<100;i++) t[i]=0;
    }

    void clear()
    {
        for (int i=0;i<100;i++) t[i]=0;
    }

    void init() { t[0]=1; }

    void print()
    {
        for (int i=t[0];i>=1;i--) printf("%d ",t[i]);
        printf("\n");
    }

};

int n,nr,l;
int t[510];
bigint v,dp[2][1010];

inline int gcd(int a,int b)
{
    if (b==0) return a; else
        return gcd(b,a%b);
}

bigint operator + (bigint &a,bigint &b)
{
    bigint c; int r=0; c.t[0]=max(a.t[0],b.t[0]);

    for (int i=1;i<=c.t[0];i++) {
        c.t[i]=(a.t[i]+b.t[i]+r)%10; r=(a.t[i]+b.t[i]+r)/10;
    }

    if (r>0) c.t[0]++,c.t[c.t[0]]=r;

    return c;
}

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);

    scanf("%d",&n);

    for (int i=1;i<=n;i++) scanf("%d",&t[i]);

    for (int j=1;j<=1000;j++) dp[0][j].init();

    v.t[0]=v.t[1]=1; int l=1;

    for (int i=1;i<=n;i++) {

        for (int j=1;j<=1000;j++) { dp[l][j].clear(); dp[l][j].init(); }

        for (int j=1;j<=1000;j++) {
            dp[l][j]=dp[l][j]+dp[1-l][j];
            dp[l][gcd(j,t[i])]=dp[l][gcd(j,t[i])]+dp[1-l][j];
        }

        dp[l][t[i]]=v+dp[l][t[i]];
        l=1-l;
    }

    dp[1-l][1].print();

    return 0;
}