結果
| 問題 | No.3516 Very Large Range Mod |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-16 06:49:57 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 502 ms / 2,000 ms |
| コード長 | 1,128 bytes |
| 記録 | |
| コンパイル時間 | 352 ms |
| コンパイル使用メモリ | 84,992 KB |
| 実行使用メモリ | 145,212 KB |
| 最終ジャッジ日時 | 2026-04-24 20:53:34 |
| 合計ジャッジ時間 | 13,245 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
# ax + b = 0 (mod M) (0 <= x < c) の解の個数を求める
import math
def kosu(a, b, c, M):
d = math.gcd(a, M)
if b % d > 0:
return 0
a //= d
b //= d
M //= d
x0 = (-b * pow(a, -1, M)) % M
if x0 >= c:
return 0
return (c - 1 - x0) // M + 1
N, K, M = map(int, input().split())
B = list(map(int, input().split()))
C = list(map(int, input().split()))
def remo(A):
# AからK個除く
cnt = K
S = 0
while True:
(x,y) = A.pop()
S += x * y
if cnt - x > 0:
cnt -= x
elif cnt - x == 0:
return (S, A)
else:
A.append((x - cnt, y))
S -= (x - cnt) * y
return (S, A)
X = list(zip(B, C))
(S, P) = remo(list(reversed(X)))
(dummy, Q)= remo(X)
P.reverse()
# P - Qを計算する
W = []
while len(P) > 0:
(x0, y0) = P.pop()
(x1, y1) = Q.pop()
if x0 < x1:
W.append((x0, y0 - y1))
Q.append((x1 - x0, y1))
elif x0 == x1:
W.append((x0, y0 - y1))
else:
W.append((x1, y0 - y1))
P.append((x0 - x1, y0))
W.reverse()
# 累積計算
ans = (1 if S % M == 0 else 0)
for (a, b) in W:
ans += kosu(b % M, S % M, a, M)
S += a * b
print(ans)