CSES - Putka Open 2020 – 3/5 - Results
Submission details
Task:Numerot
Sender:Metabolix
Submission time:2020-10-18 10:32:13 +0300
Language:CPython3
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#1--1, 2, 3details
#2--2, 3details
#3--3details

Code

#!/usr/bin/python3

def f(luku, maxnum = 0, cache = dict()):
	key = (maxnum, luku)
	if key in cache:
		return cache[key]
	if luku < maxnum:
		return 1, -maxnum
	if luku <= 9:
		if maxnum == 0:
			return 1, -luku
		return 2, -(luku + maxnum)

	askelia = 0
	muutos = 0
	while luku > 9:
		s = str(luku)[::-1]
		muutettu = False
		for i in range(1, len(s) - 1):
			if s[i] != "0":
				newmaxnum = max(maxnum, max(int(s[j]) for j in range(i+1, len(s))))
				a, m = f(luku % (10**(i+1)), newmaxnum)
				askelia += a
				muutos += m
				luku += m
				muutettu = True
				break
		if not muutettu:
			askelia += 1
			num = max(maxnum, int(s[-1]), int(s[0]))
			muutos -= num
			luku -= num
	cache[key] = askelia, muutos
	return cache[key]

def helppo(alkumax, ylin, nollia, alin, cache = dict()):
	key = (alkumax, ylin, nollia, alin)
	if key in cache:
		return cache[key]

	askelia, muutos = 0, 0
	while ylin > 0:
		# Nyt luku on muotoa {ylin}00000{alin}
		# Aiheutetaan kymmenylitys, jossa ylin laskee yhdellä.
		maxnum = max(alkumax, ylin, alin)
		if maxnum <= alin:
			maxnum2 = max(alkumax, ylin, alin - maxnum)
			askelia += 2
			muutos -= maxnum + maxnum2
			alin = (alin - maxnum - maxnum2) % 10
		else:
			askelia += 1
			muutos -= maxnum
			alin = (alin - maxnum) % 10
		ylin -= 1

		if nollia > 0:
			# Nyt luku on muotoa {ylin}99999{alin}
			# Tuhotaan yhdeksiköt pienimmästä alkaen.
			for i in range(nollia - 1):
				maxnum = 9
				a, m = helppo(9, 9, i, alin)
				askelia += a
				muutos += m
				alin = (alin + m) % 10

			# Nyt luku on muotoa {ylin}90000{alin}
			i = nollia - 1
			maxnum = max(alkumax, ylin)
			a, m = helppo(maxnum, 9, i, alin)
			askelia += a
			muutos += m
			alin = (alin + m) % 10

	val = (askelia, muutos)
	cache[key] = val
	return val

def f(luku, maxnum = 0, cache = dict()):
	askelia, muutos = 0, 0
	kymppi = 10
	nollia = 0
	while luku > 9:
		ylin = luku // kymppi % 10
		alin = luku % 10
		alkumax = max(int(i) for i in str(luku // kymppi // 10))
		a, m = helppo(max(maxnum, alkumax), ylin, nollia, alin)
		askelia += a
		muutos += m
		luku += m
		kymppi *= 10
		nollia += 1
	return askelia, muutos

#print((10812292252, -91723876114), "oikea")
#print(f(91723876123, 0), "laskettu")

#print((1092, -9828), "oikea")
#print(f(9829, 9), "laskettu")

def g(x):
	return f(x)[0] + 1

t = int(input())
for _ in range(t):
	x = int(input())
	if x == 1:
		print(1)
		continue
	k0, k1 = 9, 10**19
	while (k1 - k0) > 1:
		k = (k1 + k0) // 2
		if g(k) < x:
			k0 = k
		else:
			k1 = k
	print(k1)

Test details

Test 1

Group: 1, 2, 3

Verdict:

input
1000
1
2
3
4
...

correct output
1
10
11
20
22
...

user output
(empty)

Test 2

Group: 2, 3

Verdict:

input
1000
224995
413660
249827
2125
...

correct output
1731724
3216040
1940719
14585
532612
...

user output
(empty)

Test 3

Group: 3

Verdict:

input
1000
627887018110416188
785474884983906653
653772166720939773
784335285960673683
...

correct output
5530371754830260284
6918696171534226533
5757755627065159149
6908439780325129803
3223801064342340738
...

user output
(empty)