Cod sursa(job #2611252)

Utilizator Rares31100Popa Rares Rares31100 Data 6 mai 2020 16:42:16
Problema Indep Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("indep.in");
ofstream out("indep.out");

int n,a[501];
int dp[2][1001][1001];
int one[1001],zero[1001];

int cmmdc(int a,int b)
{
    int rest;
    while(b)
    {
        rest=a%b;
        a=b;
        b=rest;
    }

    return a;
}

int adauga(int a[],int b[],bool del=false)
{
    if(del)
    {
        for(int i=1;i<=a[0];i++)
            a[i]=0;
        a[0]=0;
    }

    int lung = max(a[0],b[0]);

    for(int i=1;i<=lung && i<=b[0]+2;i++)
    {
        a[i]+=b[i];
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }

    if(a[lung+1])
        lung++;

    a[0]=lung;
}

int main()
{
    in>>n;

    for(int i=1;i<=n;i++)
        in>>a[i];

    one[0]=one[1]=1;
    adauga(dp[0][ a[1] ],one);

    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=1000;j++)
            if(i%2)
                adauga(dp[0][j],zero,true);
            else
                adauga(dp[1][j],zero,true);

        for(int j=1;j<=1000;j++)
        {
            if(i%2)
            {
                adauga(dp[0][ cmmdc(j,a[i]) ],dp[1][j]);
                adauga(dp[0][j],dp[1][j]);
            }
            else
            {
                adauga(dp[1][ cmmdc(j,a[i]) ],dp[0][j]);
                adauga(dp[1][j],dp[0][j]);
            }
        }

        if(i%2)
            adauga(dp[0][ a[i] ],one);
        else
            adauga(dp[1][ a[i] ],one);
    }

    if(n%2)
    {
        if(dp[0][1][0])
            for(int k=dp[0][1][0];k;k--)
                out<<dp[0][1][k];
        else
            out<<'0';
    }
    else
    {
        if(dp[1][1][0])
            for(int k=dp[1][1][0];k;k--)
                out<<dp[1][1][k];
        else
            out<<'0';
    }

    return 0;
}