結果
| 問題 |
No.2589 Prepare Integers
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-07 17:01:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,823 bytes |
| コンパイル時間 | 211 ms |
| コンパイル使用メモリ | 82,532 KB |
| 実行使用メモリ | 80,184 KB |
| 最終ジャッジ日時 | 2024-09-27 07:50:56 |
| 合計ジャッジ時間 | 9,286 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 24 |
ソースコード
def safe_mod(a, b):
c = a % b
return c + b if c < 0 else c
def ext_gcd(a, b):
u, v, x, y = 1, 0, 0, 1
while a > 0:
q = b // a
x, u = u, x - q * u
y, v = v, y - q * v
b, a = a, b - q * a
return x, y
def op(a, b):
ret, p = 0, 1
while a > 0 or b > 0:
ret += (a + b) % k * p
a //= k
b //= k
p *= k
return ret
def op_pow(a, n):
if n == 0:
return 0
n = safe_mod(n, k)
ret, p = 0, 1
while a > 0:
ret += safe_mod(a % k * n, k) * p
a //= k
p *= k
return ret
def query1(x):
a = [x]
for i in reversed(range(log)):
g = msd[i]
v = [0] * len(a)
prod = [0] * (len(a) + 1)
for j in range(len(a)):
u = a[j] // powk[i]
prod[j], v[j] = ext_gcd(g, u)
g = g * prod[j] + u * v[j]
prod[j] = safe_mod(prod[j], k)
v[j] = safe_mod(v[j], k)
for j in reversed(range(1, len(a))):
prod[j - 1] = safe_mod(prod[j - 1] * prod[j], k)
t = op_pow(basis[i], prod[0])
prod[-1] = 1
for j in range(len(a)):
t = op(t, op_pow(a[j], v[j] * prod[j + 1] % k))
for j in range(len(a)):
a[j] = op(a[j], op_pow(t, -(a[j] // powk[i]) // g))
a.append(op(basis[i], op_pow(t, -msd[i] // g)))
if g != k:
basis[i] = t
msd[i] = g
for i in range(log):
cnt[i + 1] = cnt[i] * (k // msd[i])
return
def query2(x):
if x > cnt[log]:
print(-1)
return
x -= 1
ans = 0
for i in reversed(range(log)):
if basis[i] == 0:
continue
u, v = msd[i], ans // powk[i]
ans = op(ans, op_pow(basis[i], x // cnt[i] - v // u))
x %= cnt[i]
print(ans)
return
def query3(x):
x += 1
ans, y = 0, 0
for i in reversed(range(log)):
if basis[i] == 0:
u, v = x // powk[i] % k, y // powk[i] % k
if u == v:
continue
if u > v:
ans += cnt[i]
break
else:
d, u = y // powk[i] % k, msd[i]
y = op(y, op_pow(basis[i], -(d // u)))
d %= u
v = x // powk[i] % k - d
ans += (v + u - 1) // u * cnt[i]
if v % u > 0:
break
y = op(y, op_pow(basis[i], v // u))
print(ans)
return
A_MAX = 1e9
k, q = list(map(int, input().split(" ")))
powk = [1]
while powk[-1] * k <= A_MAX:
powk.append(powk[-1] * k)
log = len(powk)
basis = [0] * log
msd = [k] * log
cnt = [1] * (log + 1)
for _ in range(q):
t, x = list(map(int, input().split(" ")))
if t == 1:
query1(x)
if t == 2:
query2(x)
if t == 3:
query3(x)