結果
| 問題 |
No.2934 Digit Sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-09-30 10:09:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 79 ms / 2,000 ms |
| コード長 | 1,324 bytes |
| コンパイル時間 | 354 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 79,744 KB |
| 最終ジャッジ日時 | 2024-10-12 07:57:30 |
| 合計ジャッジ時間 | 2,567 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 25 |
ソースコード
"""
calc(D,S)
D桁以下の整数であって、桁の和がSであるものの個数
(1+x+x^2+..+x^9)^D/(1-x) の x^S の係数
=[x^S](1-x^10)^D/(1-x)^(D+1)
=sum[k=0..D] [x^(S-10*k)] C(D,k)*(-1)^k/(1-x)^(D+1)
=sum[k=0..D] C(D,k)*(-1)^k*C(S-10*k+D,S-10*k)
O(min(D,S)^2/10)
"""
def calc(D:int,S:int)->int:
res=0
c1=1
for i in range(D+1):
if 10*i>S:break
s=S-10*i
c2=1
for j in range(s):
c2*=(s+D-j)
c2//=(j+1)
res+=(-1 if i%2 else 1)*c1*c2
c1*=(D-i)
c1//=(i+1)
return res
"""
slv(S,K)
桁和がSであるような非負整数のうちK番目に大きいもの
桁を二分探索して決め打ちをしてあとは上の桁から決めていく
"""
def slv(S:int,K:int)->str:
L=0
R=100000
while R-L>1:
mid=(L+R)//2
if calc(mid,S)>=K:R=mid
else:L=mid
lim=R
ans=[]
for i in range(lim-1,-1,-1):
for j in range(10):
res=calc(i,S-j)
if K<=res:
if len(ans) or j:ans.append(str(j))
S-=j
break
K-=res
return "".join(ans)
S,K=map(int,input().split())
"""
K<=10^18 より、桁和は大きくても9*18までにしかならない
"""
S=min(S,9*18)
K+=1
res=slv(S,K)
print("".join(res))