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 <iostream>
#include <cstdio>

using namespace std;

long long potegi[20];

int n, dlugosc, koniec, dl;
long long a, ksero, poczatek, result; 

int main ()
{
	potegi[0] = 1;
	for (int i = 1; i < 19; ++i) potegi[i] = 10 * potegi[i - 1];
	scanf("%d", &n);
	for (int i = 0; i < n; ++i)
	{
		scanf("%lld", &a);
		dl = 0;
		ksero = a;
		while (ksero)
		{
			ksero /= 10;
			dl++;
		}
		if (dl > dlugosc)
		{
			dlugosc = dl;
			poczatek = a;
			continue;
		}
		if (dl == dlugosc)
		{
			if (poczatek < a)
			{
				poczatek = a;
				continue;
			}
			dlugosc++;
			poczatek = a * 10;
			result++;
			continue;
		}
		if (dlugosc < 18)
		{
			ksero = poczatek / potegi[dlugosc - dl];
			if (a < ksero)
			{
				poczatek = a * potegi[dlugosc - dl + 1];
				dlugosc++;
				result += (long long)(dlugosc - dl);
				continue;
			}
			if (a > ksero)
			{
				poczatek = a * potegi[dlugosc - dl];
				result += (long long)(dlugosc - dl);
				continue;
			}
			if ((poczatek % potegi[dlugosc - dl]) + 1 == potegi[dlugosc - dl])
			{
				poczatek = a * potegi[dlugosc - dl + 1];
				dlugosc++;
				result += (long long)(dlugosc - dl);
				continue;
			}
			poczatek++;
			result += (long long)(dlugosc - dl);
			continue;
		}
		ksero = poczatek / potegi[18 - dl];
		if (a < ksero)
		{
			dlugosc++;
			poczatek = a * potegi[18 - dl];
			result += (long long)(dlugosc - dl);
			continue;
		}
		if (a > ksero)
		{
			poczatek = a * potegi[18 - dl];
			result += (long long)(dlugosc - dl);
			continue;
		}
		poczatek++;
		result += (long long)(dlugosc - dl);
		continue;
	}
	printf("%lld\n", result);
	return 0;
}