結果
| 問題 |
No.2589 Prepare Integers
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-15 11:54:19 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,409 bytes |
| コンパイル時間 | 272 ms |
| コンパイル使用メモリ | 82,292 KB |
| 実行使用メモリ | 79,508 KB |
| 最終ジャッジ日時 | 2024-09-27 07:51:13 |
| 合計ジャッジ時間 | 8,233 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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 b, 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]
g, prod[j], v[j] = ext_gcd(g, u)
prod[j], v[j] = safe_mod(prod[j], k), 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
ans = 0
for i in reversed(range(log)):
ans = op(ans, op_pow(basis[i], (x - 1) // cnt[i] - ans // powk[i] // msd[i]))
print(ans)
return
def query3(x):
t, ans = 0, 0
for i in reversed(range(log)):
r, d = t // powk[i] % msd[i], (x + 1) // powk[i] % k
ans += (d - r + msd[i] - 1) // msd[i] * cnt[i]
if (d - r) % msd[i] != 0:
break
t = op(t, op_pow(basis[i], (d - t // powk[i] % k) // msd[i]))
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)