CSES - Putka Open 2020 – 3/5 - Results
Submission details
Task:Numerot
Sender:tykkipeli
Submission time:2020-10-18 03:47:34 +0300
Language:Python3 (CPython3)
Status:READY
Result:25
Feedback
groupverdictscore
#1ACCEPTED12
#2ACCEPTED13
#30
Test results
testverdicttimegroup
#1ACCEPTED0.69 s1, 2, 3details
#2ACCEPTED0.72 s2, 3details
#3--3details

Code

dp = [[[[(0,0)]*11 for i in range(11)] for k in range(11)] for j in range(30)]
done = [[[[False]*11 for i in range(11)] for k in range(11)] for j in range(30)]
def maxdigit(n):
ans = 0
while n > 0:
ans = max(ans, n%10)
n //= 10
return ans
def solve(a,b,c,d):
if done[a][b][c][d]:
return dp[a][b][c][d]
done[a][b][c][d] = True
if a == 1:
dp[a][b][c][d] = (0,d)
return dp[a][b][c][d]
if c == 1:
if a == 2:
val = 10+d
cnt = 0
while val >= 10:
val -= max(b,maxdigit(val))
cnt += 1
dp[a][b][c][d] = (cnt,val)
return dp[a][b][c][d]
else :
if b > d:
p = solve(a-1,9,1,10+d-b-1)
pp = solve(a-1,b,9,p[1])
dp[a][b][c][d] = (p[0] + pp[0], pp[1])
return dp[a][b][c][d]
else:
x = max(1,b)
p = solve(a-1,9,1,10-x-1)
pp = solve(a-1,b,9,p[1])
lisa = 0
if d > 0:
lisa += 1
dp[a][b][c][d] = (p[0] + pp[0] + lisa, pp[1])
return dp[a][b][c][d]
else:
kaytossa = max(b,c)
if b >= c or a == 2:
p = solve(a,kaytossa,1,d)
pp = solve(a,b,c-1,p[1])
dp[a][b][c][d] = (p[0] + pp[0], pp[1])
return dp[a][b][c][d]
else:
if c > d:
p = solve(a,c-1,1,d-1)
pp = solve(a,b,c-1,p[1])
dp[a][b][c][d] = (p[0] + pp[0], pp[1])
return dp[a][b][c][d]
else:
p = solve(a,b,c,0)
dp[a][b][c][d] = (p[0] + 1, p[1])
return dp[a][b][c][d]
def ratkaise(y):
n = len(y)
x = [0]*n
for i in range(n):
x[i] = ord(y[i])-ord('0')
prefmax = [0]*(n+1)
prefmax[0] = x[0]
i = 1
while i < n:
prefmax[i] = max(prefmax[i-1], x[i])
i += 1
ans = 0
digit = x[n-1]
ind = 1
i = n-1
while i >= 0:
numero = x[i]
if numero != 0:
maxi = 0
if i > 0:
maxi = prefmax[i-1]
p = dp[ind][maxi][numero][digit]
ans += p[0]
digit = p[1]
ind += 1
i -= 1
return ans + 1
for i in range(1,23):
for j in range(10):
for k in range(1,10):
for l in range(10):
solve(i,j,k,l)
t = int(input())
for i in range(t):
a = int(input())
x = 0
for i in range(67,-1,-1):
if ratkaise(str(x+(1<<i))) < a:
x |= (1<<i)
print(x+1)

Test details

Test 1

Group: 1, 2, 3

Verdict: ACCEPTED

input
1000
1
2
3
4
...

correct output
1
10
11
20
22
...

user output
1
10
11
20
22
...
Truncated

Test 2

Group: 2, 3

Verdict: ACCEPTED

input
1000
224995
413660
249827
2125
...

correct output
1731724
3216040
1940719
14585
532612
...

user output
1731724
3216040
1940719
14585
532612
...
Truncated

Test 3

Group: 3

Verdict:

input
1000
627887018110416188
785474884983906653
653772166720939773
784335285960673683
...

correct output
5530371754830260284
6918696171534226533
5757755627065159149
6908439780325129803
3223801064342340738
...

user output
(empty)