Cod sursa(job #2399511)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 7 aprilie 2019 17:44:27
Problema Indep Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <cstdio>
#include <vector>

#define B 1000000

using namespace std;

int n,x,m,l=1;

struct Numar{
    vector <int> nr;
    Numar(){
        nr = vector <int>(1);
    }
    Numar(int val){
        nr = vector <int>(1,val);
    }
    void aduna(Numar b){
        vector <int> rez;
        int t=0, len = min(nr.size(),b.nr.size());
        for(int i = 0;i < len; ++i){
            t += nr[i] + b.nr[i];
            rez.push_back(t%B);
            t/=B;
        }
        for(int i = len; i < nr.size(); ++i){
            t += nr[i];
            rez.push_back(t%B);
            t/=B;
        }
        for(int i = len; i < b.nr.size(); ++i){
            t += b.nr[i];
            rez.push_back(t%B);
            t/=B;
        }
        while(t){
            rez.push_back(t%B);
            t/=B;
        }
        nr = rez;
    }
}dp[2][1005];

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

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

    scanf("%d%d", &n,&m);
    dp[0][m]=Numar(1);
    for(int i = 1;i < n; ++i){
        scanf("%d", &x);
        for(int j=1;j<=m;++j){
            dp[l][j] = dp[!l][j];
            dp[l][cmmdc(x,j)].aduna(dp[!l][j]);
        }
        dp[l][x].aduna(Numar(1));
        m = max(m,x);
        l=!l;
    }

    for(int i = 1; i < dp[!l][1].nr.size(); ++i)
        printf("%6d", dp[!l][1].nr[i-1]);
    cout<<dp[!l][1].nr.back();

    return 0;
}