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
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <vector>
#include <algorithm>

#define N 17

void digits(long long int a, std::vector<int> & ret){
	while (a > 0) {
		ret.push_back(a % 10);
		a/=10;
	}
	std::reverse(ret.begin(),ret.end());
}

int biggerOrEq(std::vector<int> & prev, std::vector<int> & next){
	if (prev.size() > next.size()) return 1;
	if (prev.size() < next.size()) return 0;
	for(int i = 0; i < (int) prev.size(); ++i){
		if (prev[i] < next[i]) return 0;
		if (prev[i] > next[i]) return 1;
	}
	return 1;
}

int upgradeNumber(std::vector<int> & prev, std::vector<int> & next, long long int & total){
	//next jest mniejszy
	for(int i = 0; i < (int) next.size(); ++i){
		if (prev[i] < next[i]){//uzupelniamy zerami
//			printf("++++++++++++++=\n");
			int toAdd = ((int) prev.size() - (int)next.size());
			for(int j = 0; j < toAdd; ++j) {
				next.push_back(0);
				++total;
			}
			return 0;
		}
		if (prev[i] > next[i]){//jestesmy mniejsi wiec musimy dodac cyfre i uzupelniamy sie zerami ale o jedno wiecej
			int toAdd = ((int) prev.size() - (int)next.size()) + 1;
//			printf("****************\n");
			for(int j = 0; j < toAdd ; ++j) {
				next.push_back(0);
				++total;
			}
			if (next.size() > N){
				next.pop_back();
				--total;
				return 1;
			}
			return 0;
		}
	}
	//tutaj wystarczy ze podbijemy poprzednia o jeden i mozemy podbic bo przynajmenij jedna z cyfr ktora moze byc dodana nie jest 9tka
//	printf("--------------------\n");
	for(int i = (int)prev.size() - 1; i >= (int)next.size(); --i){
		if (prev[i] < 9) {
			int toAdd = ((int) prev.size() - (int)next.size());
			next = prev;
			next.back() += 1;
			int j = next.size() - 1;
			while(j >= 0 && next[j] > 9){
				next[j] -= 10;
				next[j-1] += 1;
				--j;
			}
			total += toAdd;//dodajemy roznice
			return 0;
		}
	}

//	printf("=========================\n");
	//przypadek brzegowy sa same 9tki wiec trzeba podbic liczbe cyfr
	int toAdd = ((int) prev.size() - (int)next.size()) + 1;
	total += toAdd;
	for(int j = 0; j < toAdd; ++j) {
		next.push_back(0);
	}
	int addedZeros = 0;
	while(next.size() > N){
		++addedZeros;
		next.pop_back();
	}
	return addedZeros;
}


void print(std::vector<int> & prev){
	for(int i = 0; i < (int) prev.size(); ++i) printf("%d",prev[i]);
	printf("  ");
}

int main(){
	int n;
	long long int total = 0;
	long long int zeros = 0;
	long long int a;

	std::vector<int> lastNumber;
	std::vector<int> nextNumber;
	scanf("%d",&n);
	for(int i = 0; i < n; ++i){
		scanf("%lld",&a);
		digits(a,nextNumber);
		if (biggerOrEq(lastNumber,nextNumber)){
			zeros += upgradeNumber(lastNumber,nextNumber,total);

			total += zeros;
		} else {
			total += zeros;
		}
//		print(nextNumber);printf("\n");
		lastNumber = nextNumber;
		nextNumber.clear();
//		print(lastNumber);
//		printf("%lld\n",zeros);
	}
	printf("%lld\n",total);
	return 0;
}