Cod sursa(job #2824282)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 31 decembrie 2021 22:14:26
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

const int base = 1000000000;

void add(int A[], int B[]) {
    int i, t = 0;
    for(i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base)
            A[i] = (t += A[i] + B[i]) % base;
    A[0] = i - 1;
}

int dp[2][1001][21];
int a[501];
int N;

void solve() {
    for(int i = 0;i <= 1;i++)
        for(int j = 0;j <= 1000;j++)
            dp[i][j][0] = 1;
    cin >> N;
    dp[0][0][1] = 1;
    for(int i = 1;i <= N;i++) {
        cin >> a[i];
        for(int j = 0;j <= 1000;j++) 
            memcpy(dp[i & 1][j], dp[(i - 1) & 1][j], sizeof(dp[i & 1][j]));

        for(int j = 0;j <= 1000;j++) 
            add(dp[i & 1][__gcd(j, a[i])], dp[(i - 1) & 1][j]);    
    }

    cout << (dp[N & 1][1][0] == 0? 0 : dp[N & 1][1][dp[N & 1][1][0]]);
    for(int i = dp[N & 1][1][0] - 1;i >= 1;i--) {
        cout << setw(9) << setfill('0') << dp[N & 1][1][i];
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    Open("indep");

    int T = 1;
    for(;T;T--) {
        solve();
    }

    return 0;
}