若干ゴリ押し感がある。
https://yukicoder.me/problems/no/757
問題
B進数のチャンパーノウン定数の小数第D位(DもB進数表記)を求めよ。
解法
n桁のB進数は個あるので、n桁以下のB進数を並べると計
桁になる。
多倍長が使える言語で上記式を二分探索し、D桁目が何桁のB進数を並べた領域にあるかを求めよう。
それがわかれば、あとはD桁目がその桁数のB進数を並べた文字列の何文字目かわかるので、累乗と除算を駆使してその場所を求めればよい。
def Sn(n): bn = B**n return n*bn - (bn-1)/(B-1) B=int(raw_input()) C=raw_input().strip() D=0 for c in C: D=D*B+(ord(c)-ord('0')) D-=1 L=0 for i in range(16,-1,-1): if Sn(L+(1<<i))<=D: L += 1<<i D -= Sn(L) L += 1 mo = D % L D = (B**(L-1)) + D/L D /= B**(L-1-mo) print str(D%B)
まとめ
多倍長ライブラリが無いと辛そう。