Cod sursa(job #3314474)

Utilizator postolacheepostolache postolachee Data 10 octombrie 2025 10:12:46
Problema Indep Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
//#define int long long
#pragma GCC optimize ("O4,Ofast,unroll-loops")
#define pb push_back
using namespace std;

vector <vector<int>> dp(1001, {0});

void Adunare(vector <int> &a,vector <int> b){
    while (b.size()>a.size()){
        a.push_back(0);
    }
    while (b.size()<a.size()){
        b.push_back(0);
    }
    int r = 0;
    for (int i=0;i<a.size();++i){
        a[i] = a[i]+b[i]+r;
        r = a[i]/10;
        a[i] = a[i]%10;
    }
    if (r){
        a.push_back(r);
    }
    return;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ifstream cin ("indep.in");
    ofstream cout ("indep.out");
    int n;cin >> n;
    vector <int> v;
    for(int i=0;i < n;i++){
        int x;cin >> x;v.pb(x);
    }
    //dp[v[0]]=1;
    Adunare(dp[v[0]], {1});
    vector <int> tweaking;
    tweaking.pb(v[0]);
    for(int i=1;i < n;i++){
        vector<int> tweakingv2=tweaking;
        vector<int> aux;
        for(auto j : tweaking){
            Adunare(dp[__gcd(v[i], j)], dp[j]);
            aux.pb(__gcd(v[i], j));
        }
        tweaking.resize(0);
        aux.pb(v[i]);
        int s1=0,s2=0;
        while(s1 + s2 < tweakingv2.size() + aux.size()){
            if(s1 == tweakingv2.size()){
                if(tweaking[tweaking.size()] == aux[s2]){
                    s2++;
                }else{
                    tweaking.pb(aux[s2++]);
                }
            }else if(s2 == aux.size()){
                if(tweaking[tweaking.size()] == tweakingv2[s1]){
                    s1++;
                }else{
                    tweaking.pb(tweakingv2[s1++]);
                }
            }else{
                if(tweakingv2[s1] < aux[s2]){
                    if(tweaking[tweaking.size()] == tweakingv2[s1]){
                        s1++;
                    }else{
                        tweaking.pb(tweakingv2[s1++]);
                    }
                }else{
                    if(tweaking[tweaking.size()] == aux[s2]){
                        s2++;
                    }else{
                        tweaking.pb(aux[s2++]);
                    }
                }
            }
        }
        //dp[v[i]]++;
        Adunare(dp[v[i]], {1});
    }
    reverse(dp[1].begin(), dp[1].end());
    bool ok = true;
    for(auto x : dp[1]){
        if(x == 0 && ok)continue;
        ok=false;
        cout << x;
    }
    return 0;
}