CSES - Putka Open 2020 – 3/5 - Results
Submission details
Task:Numerot
Sender:Metabolix
Submission time:2020-10-18 10:32:13 +0300
Language:Python3 (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)