#include <iostream>
//#include <algorithm>
//#include <cmath>
//#include <vector>
//#include <cstdlib>
//#include <stdint.h>
#include <stdio.h>
#ifdef _WIN32
inline int getchar_unlocked() {
return getchar();
}
#endif
using namespace std;
//typedef int64_t ul;
typedef int ul;
char ch;
//int sign;
inline void readU( ul& x ) {
x = 0;
//while((ch < '0' || ch > '9') && ch != '-' && ch != EOF)
while((ch < '0' || ch > '9') && ch != EOF)
ch = getchar_unlocked();
//if (ch == '-')
// sign = -1, ch = getchar_unlocked();
//else
// sign = 1;
do
x = (x << 3) + (x << 1) + ch - '0';
while((ch = getchar_unlocked()) >= '0' && ch <= '9');
//x *= sign;
}
struct Number {
uint64_t a;
uint64_t zeros;
Number(int a) : a(a), zeros(0) {}
static pair<Number, uint64_t> next(Number T, int n_a) {
Number res(n_a);
if (T.zeros == 0 && T.a < res.a) {
return {res, 0};
}
if (T.a < res.a) {
cout << "normalization fail?" << endl;
exit(-1);
}
// zeros will be needed
// new number can have len+1 and only zeros
// or same len, then it will be old+1
// check if old+1 prefix agree:
uint64_t t = T.a + 1;
uint64_t mul = 1;
uint64_t digs_added = 0;
while (t > res.a) {
mul *= 10;
digs_added++;
t /= 10;
}
if (t == res.a) {
res.a = T.a + 1;
} else {
res.a *= mul;
}
res.zeros = T.zeros;
digs_added += T.zeros;
while (res.a > 3372036854775807LL) { // or something...
res.a /= 10;
res.zeros++;
}
return {res, digs_added};
}
};
int main() {
std::ios_base::sync_with_stdio(0);
int n, ai;
readU(n);
Number nb(0);
uint64_t res = 0;
while (n--) {
readU(ai);
pair<Number, uint64_t> r = Number::next(nb, ai);
nb = r.first;
res += r.second;
}
cout << res << endl;
}
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 92 93 94 95 96 97 98 99 | #include <iostream> //#include <algorithm> //#include <cmath> //#include <vector> //#include <cstdlib> //#include <stdint.h> #include <stdio.h> #ifdef _WIN32 inline int getchar_unlocked() { return getchar(); } #endif using namespace std; //typedef int64_t ul; typedef int ul; char ch; //int sign; inline void readU( ul& x ) { x = 0; //while((ch < '0' || ch > '9') && ch != '-' && ch != EOF) while((ch < '0' || ch > '9') && ch != EOF) ch = getchar_unlocked(); //if (ch == '-') // sign = -1, ch = getchar_unlocked(); //else // sign = 1; do x = (x << 3) + (x << 1) + ch - '0'; while((ch = getchar_unlocked()) >= '0' && ch <= '9'); //x *= sign; } struct Number { uint64_t a; uint64_t zeros; Number(int a) : a(a), zeros(0) {} static pair<Number, uint64_t> next(Number T, int n_a) { Number res(n_a); if (T.zeros == 0 && T.a < res.a) { return {res, 0}; } if (T.a < res.a) { cout << "normalization fail?" << endl; exit(-1); } // zeros will be needed // new number can have len+1 and only zeros // or same len, then it will be old+1 // check if old+1 prefix agree: uint64_t t = T.a + 1; uint64_t mul = 1; uint64_t digs_added = 0; while (t > res.a) { mul *= 10; digs_added++; t /= 10; } if (t == res.a) { res.a = T.a + 1; } else { res.a *= mul; } res.zeros = T.zeros; digs_added += T.zeros; while (res.a > 3372036854775807LL) { // or something... res.a /= 10; res.zeros++; } return {res, digs_added}; } }; int main() { std::ios_base::sync_with_stdio(0); int n, ai; readU(n); Number nb(0); uint64_t res = 0; while (n--) { readU(ai); pair<Number, uint64_t> r = Number::next(nb, ai); nb = r.first; res += r.second; } cout << res << endl; } |
English