#include <cstdio> #include <vector> #include <algorithm> using namespace std; char num_length(int n) { char result = 0; while (n>0) { ++result; n/=10; } return result; } int pow10(int k) { int result = 1; for(int i=0; i<k; ++i) result *= 10; return result; } struct Num { int x, w, p; Num(int x, int w = 0, int p = 0) { _init(x, w, p); } void _init(int x, int w, int p) { if (w < 0) w = 0; this->w = w; this->x = x; this->p = p; _clean(); } void _clean() { char p_length = num_length(p); if (p_length > w) { int p10 = pow10(w); x += p / p10; p = p % p10; } while (x>0 && x%10==0) { x /= 10; w += 1; } } void inc() { ++p; _clean(); } long long render(int a_len, int x_len = -1) { long long r = x; if (x_len == -1) x_len = num_length(x); if (a_len <= x_len) { for(int i=0; i<x_len-a_len; ++i) r /= 10; } else { for(int i=0; i<a_len-x_len; ++i) r *= 10; int p_len = num_length(p); if (w - p_len < a_len-x_len) { int shifted_p = p; for (int i=0; i<x_len+w-a_len; ++i) shifted_p /= 10; r += shifted_p; } } return r; } int extend(long long a) { int a_len = num_length(a); int x_len = num_length(x); if (a_len > x_len + w) { _init(a, 0, 0); return 0; } long long r = render(a_len); if (r == a) return x_len + w - a_len; int result = x_len + w - a_len; if (a < r) result += 1; _init(a, result, 0); return result; } }; int n, a; long long w; int main() { w = 0; scanf("%d", &n); scanf("%d", &a); Num A(a); for (int i=1; i<n; ++i) { A.inc(); scanf("%d", &a); w = w + A.extend(a); } printf("%lld\n", w); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; char num_length(int n) { char result = 0; while (n>0) { ++result; n/=10; } return result; } int pow10(int k) { int result = 1; for(int i=0; i<k; ++i) result *= 10; return result; } struct Num { int x, w, p; Num(int x, int w = 0, int p = 0) { _init(x, w, p); } void _init(int x, int w, int p) { if (w < 0) w = 0; this->w = w; this->x = x; this->p = p; _clean(); } void _clean() { char p_length = num_length(p); if (p_length > w) { int p10 = pow10(w); x += p / p10; p = p % p10; } while (x>0 && x%10==0) { x /= 10; w += 1; } } void inc() { ++p; _clean(); } long long render(int a_len, int x_len = -1) { long long r = x; if (x_len == -1) x_len = num_length(x); if (a_len <= x_len) { for(int i=0; i<x_len-a_len; ++i) r /= 10; } else { for(int i=0; i<a_len-x_len; ++i) r *= 10; int p_len = num_length(p); if (w - p_len < a_len-x_len) { int shifted_p = p; for (int i=0; i<x_len+w-a_len; ++i) shifted_p /= 10; r += shifted_p; } } return r; } int extend(long long a) { int a_len = num_length(a); int x_len = num_length(x); if (a_len > x_len + w) { _init(a, 0, 0); return 0; } long long r = render(a_len); if (r == a) return x_len + w - a_len; int result = x_len + w - a_len; if (a < r) result += 1; _init(a, result, 0); return result; } }; int n, a; long long w; int main() { w = 0; scanf("%d", &n); scanf("%d", &a); Num A(a); for (int i=1; i<n; ++i) { A.inc(); scanf("%d", &a); w = w + A.extend(a); } printf("%lld\n", w); } |