Cod sursa(job #2315706)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 10 ianuarie 2019 14:21:44
Problema Indep Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("indep.in");
ofstream out("indep.out");
int dp[2][1001][101],v[501],one[5],Max;
const int base = 1e9;
void add(int A[], int B[])
{
    A[0] = max(A[0], B[0]);
    int t = 0;
    for(int i = 1; i <= A[0] ; ++i)
    {
        A[i] = A[i] + B[i] + t;
        t = A[i]/base;
        A[i] %= base;
    }
    if(t > 0) A[++A[0]] = t;
}
int nrcif(int x)
{
    int c = 1;
    while (x>9)
    {
        x/=10;
        c++;
    }
    return c;
}
int main()
{
    int n;
    in >> n;
    for (int i = 1; i<=n; i++)
    {
        in >> v[i];
        Max = max(Max,v[i]);
    }
    int l = 0;
    one[++one[0]] = 1;
    add(dp[1][v[1]],one);
    for (int i = 2; i<=n; i++, l = 1-l)
    {
        memset(dp[l],0,sizeof(dp[l]));
        for (int j = 1; j<=Max; j++)
        {
            add(dp[l][__gcd(v[i],j)],dp[1-l][j]);
            add(dp[l][j],dp[1-l][j]);
        }
        add(dp[l][v[i]],one);
    }
    l = 1-l;
    int sz = dp[l][1][0];
    out << dp[l][1][sz];
    for (int i = sz-1; i>=1; i--)
    {
        int x = dp[l][1][i], cnt = nrcif(x);
        for (int j = 1; j<=9-cnt; j++)
            out << "0";
        out << x;
    }
}