Cod sursa(job #1993298)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 22 iunie 2017 17:12:43
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define MAXVAL 1000
#define SIZE 200
#define BASE 10000

int dp[2][MAXVAL + 1][SIZE];
short dig[2][MAXVAL + 1];

inline int gcd(int a, int b) {
    int r;
    while(b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return a;
}


int main() {
    std::ifstream cin("indep.in");
    std::ofstream cout("indep.out");
    int i, n, val, j, sz, k, x, t;
    std::ios::sync_with_stdio(false);
    cin >> n;
    dig[0][0] = 1;
    dp[0][0][0] = 1;
    for(i = 1; i <= n; i++) {
        cin >> val;
        memset(dp[i & 1], 0, sizeof(dp[i & 1]));
        memset(dig[i & 1], 0, sizeof(dig[i & 1]));
        for(j = 0; j <= MAXVAL; j++) {
            x = gcd(val, j);
            sz = std::max(dig[i & 1][x], dig[1 - i & 1][j]);
            t = 0;
            for(k = 0; k < sz || t > 0; k++) {
                t = t + dp[i & 1][x][k] + dp[1 - i & 1][j][k];
                dp[i & 1][x][k] = t % BASE;
                t /= BASE;
            }
            dig[i & 1][x] = k;
        }
        for(j = 0; j <= MAXVAL; j++) {
            sz = std::max(dig[i & 1][j], dig[1 - i & 1][j]);
            t = 0;
            for(k = 0; k < sz || t > 0; k++) {
                t = t + dp[1 - i & 1][j][k] + dp[i & 1][j][k];
                dp[i & 1][j][k] = t % BASE;
                t /= BASE;
            }
            dig[i & 1][j] = k;
        }
    }
    for(i = dig[n & 1][1] - 1; i >= 0; i--) {
        val = dp[n & 1][1][i];
        sz = 0;
        if(val == 0)
            sz = 1;
        while(val > 0) {
            val /= 10;
            sz++;
        }
        if(i < dig[n & 1][1] - 1)
            while(sz < 4) {
                cout << 0;
                sz++;
            }
        cout << dp[n & 1][1][i];
    }
    cin.close();
    cout.close();
    return 0;
}