#include <bits/stdc++.h>
using namespace std;
#define pr if(0)
#ifndef LOCAL
#define pr if(0)
#endif
const int MAXN = 2e5+69;
using ll = long long int;
ll t, pt, pot[19], n, w;
int c, pb, b, cp;
inline void ss() {
t = b = 0;
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9') {
t = t * 10 + c - '0';
c = getchar();
}
}
#ifdef LOCAL
bool curp = false;
char ss_[2][2000000];
void p() {
char *ss = ss_[curp];
curp ^= 1;
sprintf(ss, "%lld", t);
int l = strlen(ss);
for (int i = 0; i < b; i++) {
ss[l++] = '0';
}
ss[l] = 0;
for (int ccp = cp; ccp > 0; ccp /= 10) {
ss[--l] = '0' + (ccp%10);
}
fprintf(stdout, "%s\n", ss);
}
#endif
int main() {
scanf("%lld", &n);
pot[0] = 1;
for (int i = 1; i < 19; i++)
pot[i] = pot[i-1] * 10;
ss();
#ifdef LOCAL
pr p();
pr printf("pierwsza liczba %lld ma dopisane %d zer\n", t, b);
#endif
for (int i = 1; i < n; i++) {
pt = t; pb = b;
ss();
pr fprintf(stdout, "______ %d %lld\n", i, t);
while (pt < t && pb > 0) {
pt *= 10;
pb--;
if (pb < 18) {
pt += cp / pot[pb];
cp %= pot[pb];
}
}
int mpot = 0;
while (t * pot[mpot] + pot[mpot] - 1 < pt)
mpot++;
pr printf("pt: %lld, t*pot: %lld\n", pt, t*pot[mpot]);
b = pb + mpot;
if (mpot && t * pot[mpot] <= pt) {
pr printf("assert %lld >= %lld\n", t*pot[mpot] + pot[mpot]-1, pt);
assert(t*pot[mpot] + pot[mpot] -1 >= pt);
if (b < 18)
cp += (pt % pot[mpot]) * pot[pb] + 1; // tutaj jest rozpatrzony przypadek kiedy t jest prefixem pt
else {
t = pt;
b -= mpot;
}
}
w += pb + mpot;
if (b < pb) {
w += pb - b;
b = pb;
}
pr printf("t=%lld, b=%d, pt=%lld, pb=%d, cp=%d\n", t, b, pt, pb, cp);
if (t == pt) // przypadek kiedy t jest prefixem pt jest rozpatrzony wyzej
cp++;
if (b < 18 && cp >= pot[b]) {
assert(cp == pot[b]);
cp = 0;
b++;
w++;
}
while (t % 10 == 0) {
b++;
t /= 10;
}
#ifdef LOCAL
pr p();
pr assert(strlen(ss_[curp]) < strlen(ss_[!curp]) || strcmp(ss_[curp], ss_[!curp]) < 0);
pr printf("liczba %lld ma dopisane %d zer [%d]\n", t, b, cp);
#endif
}
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <bits/stdc++.h> using namespace std; #define pr if(0) #ifndef LOCAL #define pr if(0) #endif const int MAXN = 2e5+69; using ll = long long int; ll t, pt, pot[19], n, w; int c, pb, b, cp; inline void ss() { t = b = 0; while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') { t = t * 10 + c - '0'; c = getchar(); } } #ifdef LOCAL bool curp = false; char ss_[2][2000000]; void p() { char *ss = ss_[curp]; curp ^= 1; sprintf(ss, "%lld", t); int l = strlen(ss); for (int i = 0; i < b; i++) { ss[l++] = '0'; } ss[l] = 0; for (int ccp = cp; ccp > 0; ccp /= 10) { ss[--l] = '0' + (ccp%10); } fprintf(stdout, "%s\n", ss); } #endif int main() { scanf("%lld", &n); pot[0] = 1; for (int i = 1; i < 19; i++) pot[i] = pot[i-1] * 10; ss(); #ifdef LOCAL pr p(); pr printf("pierwsza liczba %lld ma dopisane %d zer\n", t, b); #endif for (int i = 1; i < n; i++) { pt = t; pb = b; ss(); pr fprintf(stdout, "______ %d %lld\n", i, t); while (pt < t && pb > 0) { pt *= 10; pb--; if (pb < 18) { pt += cp / pot[pb]; cp %= pot[pb]; } } int mpot = 0; while (t * pot[mpot] + pot[mpot] - 1 < pt) mpot++; pr printf("pt: %lld, t*pot: %lld\n", pt, t*pot[mpot]); b = pb + mpot; if (mpot && t * pot[mpot] <= pt) { pr printf("assert %lld >= %lld\n", t*pot[mpot] + pot[mpot]-1, pt); assert(t*pot[mpot] + pot[mpot] -1 >= pt); if (b < 18) cp += (pt % pot[mpot]) * pot[pb] + 1; // tutaj jest rozpatrzony przypadek kiedy t jest prefixem pt else { t = pt; b -= mpot; } } w += pb + mpot; if (b < pb) { w += pb - b; b = pb; } pr printf("t=%lld, b=%d, pt=%lld, pb=%d, cp=%d\n", t, b, pt, pb, cp); if (t == pt) // przypadek kiedy t jest prefixem pt jest rozpatrzony wyzej cp++; if (b < 18 && cp >= pot[b]) { assert(cp == pot[b]); cp = 0; b++; w++; } while (t % 10 == 0) { b++; t /= 10; } #ifdef LOCAL pr p(); pr assert(strlen(ss_[curp]) < strlen(ss_[!curp]) || strcmp(ss_[curp], ss_[!curp]) < 0); pr printf("liczba %lld ma dopisane %d zer [%d]\n", t, b, cp); #endif } printf("%lld\n", w); } |
English