結果
問題 | No.362 門松ナンバー |
ユーザー |
![]() |
提出日時 | 2020-03-19 17:50:38 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 351 ms / 3,000 ms |
コード長 | 1,813 bytes |
コンパイル時間 | 250 ms |
コンパイル使用メモリ | 82,236 KB |
実行使用メモリ | 80,100 KB |
最終ジャッジ日時 | 2024-12-14 03:21:58 |
合計ジャッジ時間 | 7,164 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
import syssys.setrecursionlimit(10 ** 6)int1 = lambda x: int(x) - 1p2D = lambda x: print(*x, sep="\n")def II(): return int(sys.stdin.buffer.readline())def MI(): return map(int, sys.stdin.buffer.readline().split())def LI(): return list(map(int, sys.stdin.buffer.readline().split()))def LLI(rows_number): return [LI() for _ in range(rows_number)]def SI(): return sys.stdin.buffer.readline()[:-1]def main():def iskado(a,b,c):if (a,b)==(10,0) or (b,c)==(10,0):return Falseif a<10 and b==10:return Falseif a==10 and b!=c:return Trueif a==b or a==c or b==c:return Falseif a<b<c or a>b>c:return Falsereturn Truedef less(m):s=str(m)sn=len(s)dp=[[[[0]*2 for _ in range(11)] for _ in range(11)] for _ in range(sn+1)]dp[0][10][10][0]=1for i in range(1,sn):dp[i][10][10][1]=1for i,c in enumerate(s):c=int(c)for j in range(11):if i==sn-1 and j==10:breakfor k in range(11):for f in range(2):pre = dp[i][j][k][f]if pre==0:continueif f==0 and iskado(j,k,c):dp[i+1][k][c][0]+=preend=10 if f else cfor nk in range(end):if iskado(j,k,nk):dp[i+1][k][nk][1]+=presm=sum(dp[sn][j][k][f] for j in range(10) for k in range(10) for f in range(2))return sm<Kt=II()for _ in range(t):K=II()l=101r=37294859064824# 自分以下の門松ナンバーがk個未満かwhile l+1<r:m=(l+r)//2if less(m):l=melse:r=mprint(r)main()