Cod sursa(job #2273062)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 30 octombrie 2018 22:49:43
Problema Indep Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int P=(int)1e9;

class big
{
    private :
        int cif[20];
        int len;
    public :
        void operator = (const int &a)
        {
            int x=a;
            len=0;
            while(x)
            {
                cif[++len]=x%P;
                x/=P;
            }
            reverse(cif+1,cif+len+1);
        }
        big operator += (const big &a)
        {
            big ans;
            int i,rezid=0,aux;
            for(i=1;i<=len || i<=a.len || rezid>0;i++)
            {
                aux=rezid;
                if(i<=len) aux+=cif[i];
                if(i<=a.len) aux+=a.cif[i];
                ans.cif[i]=aux%P;
                rezid=aux/P;
            }
            ans.len=i-1;
            len=ans.len;
            for(int i=1;i<=len;i++)
            {
                cif[i]=ans.cif[i];
            }
        }
        void print()
        {
            printf("%d",cif[len]);
            for(int i=len-1;i>=1;i--)
            {
                printf("%.9d",cif[i]);
            }
            printf("\n");
        }
};

const int N=500+5;
const int LIM=2*N;

int g[LIM][LIM];

inline void Bgcd()
{
    for(int i=1;i<LIM;i++)
    {
        g[i][1]=g[1][i]=1;
        g[i][i]=i;
    }
    for(int i=2;i<LIM;i++)
    {
        for(int j=2;j<i;j++)
        {
            g[i][j]=g[j][i]=g[i-j][j];
        }
    }
}

big dp[N][LIM];

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    Bgcd();
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        dp[i][x]=1;
        for(int ant=1;ant<LIM;ant++)
        {
            dp[i][ant]+=dp[i-1][ant];
            int now=g[ant][x];
            dp[i][now]+=dp[i-1][ant];
        }
    }
    dp[n][1].print();
    return 0;
}