kmjp's blog

競技プログラミング参加記です

yukicoder : No.757 チャンパーノウン定数 (2)

若干ゴリ押し感がある。
https://yukicoder.me/problems/no/757

問題

B進数のチャンパーノウン定数の小数第D位(DもB進数表記)を求めよ。

解法

n桁のB進数は (B-1)*B^{n-1}個あるので、n桁以下のB進数を並べると計 n*B^n - \frac{B^n-1}{B-1}桁になる。
多倍長が使える言語で上記式を二分探索し、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)

まとめ

多倍長ライブラリが無いと辛そう。