結果

問題 No.2589 Prepare Integers
ユーザー 👑 p-adicp-adic
提出日時 2023-12-17 23:20:52
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,398 bytes
コンパイル時間 375 ms
コンパイル使用メモリ 82,348 KB
実行使用メモリ 80,204 KB
最終ジャッジ日時 2024-09-27 08:09:31
合計ジャッジ時間 7,888 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 43 ms
53,248 KB
testcase_01 AC 46 ms
53,120 KB
testcase_02 AC 43 ms
52,992 KB
testcase_03 AC 41 ms
52,992 KB
testcase_04 AC 308 ms
79,136 KB
testcase_05 AC 304 ms
78,588 KB
testcase_06 AC 280 ms
78,788 KB
testcase_07 AC 267 ms
78,452 KB
testcase_08 AC 243 ms
79,744 KB
testcase_09 AC 239 ms
78,736 KB
testcase_10 AC 253 ms
79,468 KB
testcase_11 AC 250 ms
77,904 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 AC 258 ms
79,232 KB
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 AC 243 ms
78,236 KB
testcase_25 AC 242 ms
78,860 KB
testcase_26 AC 241 ms
77,952 KB
testcase_27 AC 187 ms
77,740 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

R=range
x=0
def Expand( X , digit ):
	global x
	answer=[]
	for d in R(digit):
		if x==0:break
		if X[d]!=0:
			answer+=[x%X[d]]
			x//=X[d]
		else:answer+=[0]
	return answer

u0=u1=v0=v1=0
def PartitionOfUnity( b_0 , b_1 , K ):
	global u0 , u1 , v0 , v1
	a=[[1,0],[0,1]]
	b=[b_0,b_1]
	i_0=b_0<b_1
	i_1=1-i_0
	while b[i_1]!=0:
		q=b[i_0]//b[i_1]
		a[i_0][i_0]=(a[i_0][i_0]-q*a[i_1][i_0])%K
		a[i_0][i_1]=(a[i_0][i_1]-q*a[i_1][i_1])%K
		b[i_0]-=q*b[i_1]
		i_0,i_1=i_1,i_0
	u0,u1,v0,v1=a[i_0][0],a[i_0][1],a[i_1][0],a[i_1][1]
	return b[i_0]

def SetGcd( gcd , gcd_inv , exp , K ):
	L=len(exp)-1
	if gcd_inv[L]==0:
		gcd[L][L]=PartitionOfUnity(K,exp[L],K)
		gcd_inv[L]=K//gcd[L][L]
		for d in R(L):gcd[L][d]=exp[d]*u1%K
		return
	gcd[L][L]=PartitionOfUnity(gcd[L][L],exp[L],K)
	gcd_inv[L]=K//gcd[L][L]
	for d in R(L):gcd[L][d] , exp[d] = ( gcd[L][d] * u0 + exp[d] * u1 ) % K , ( gcd[L][d] * v0 + exp[d] * v1 ) % K
	exp.pop()
	while len(exp) and exp[-1] == 0:exp.pop()
	if len(exp):SetGcd(gcd,gcd_inv,exp,K)

O=print
J=lambda:map(int,input().split())
K,Q=J()
digit = 0
K_vec=[]
power = K*10**18
while power > 0:
	power //= K
	digit+=1
	K_vec+=[K]
gcd=[[0]*(d+1)for d in R(digit)]
gcd_inv=[0]*digit
for q in R(Q):
	type,x=J()
	if type==1:
		exp=Expand(K_vec,digit)
		SetGcd( gcd , gcd_inv , exp , K )
	elif type == 2:
		if x == 1:
			O(0)
			continue
		x-=1
		exp = Expand( gcd_inv , digit )
		if x > 0:
			O( -1 )
			continue
		L=len(exp)-1
		coef=[0]*( L + 1 )
		for l in R(L,-1,-1):
			if gcd[l][l] != 0:
				exp[l] = (exp[l] - coef[l] // gcd[l][l])%K
				for d in R(l+1):
					coef[d] = ( coef[d] + exp[l] * gcd[l][d] ) % K
		answer = 0
		power = 1
		for d in R(L+1):
			answer += coef[d] * power
			power *= K
		O( answer )
	elif type == 3:
		if x == 0:
			O( 1 )
			continue
		exp = Expand( K_vec , digit )
		L = len(exp) - 1
		coef=[0]*( L + 1 )
		lb=[0]*( L + 1 )
		for l in R(L,-1,-1):
			if gcd[l][l] == 0:
				r = exp[l] - lb[l]
				if r < 0:break
				if r > 0:
					coef[l]=1
					break
			else:
				r = exp[l] - lb[l] % gcd[l][l]
				if r < 0:break
				coef[l] = r // gcd[l][l]
				if r % gcd[l][l] != 0:
					coef[l]+=1
					break
				diff = ( coef[l] - lb[l] // gcd[l][l] ) % K
				for d in R(l+1):lb[d] = ( lb[d] + diff * gcd[l][d] ) % K
			if l == 0:coef[l]+=1
		answer = 0
		prod = 1
		for d in R(L+1):
			answer += coef[d] * prod
			if gcd_inv[d] != 0:prod *= gcd_inv[d];
		O( answer )
0