結果
| 問題 |
No.1025 Modular Equation
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 19:04:17 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,865 bytes |
| コンパイル時間 | 216 ms |
| コンパイル使用メモリ | 82,068 KB |
| 実行使用メモリ | 440,348 KB |
| 最終ジャッジ日時 | 2025-06-12 19:04:36 |
| 合計ジャッジ時間 | 9,196 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 6 TLE * 1 -- * 25 |
ソースコード
MOD = 10**9 + 7
def main():
import sys
input = sys.stdin.read().split()
ptr = 0
p = int(input[ptr]); ptr +=1
n = int(input[ptr]); ptr +=1
k = int(input[ptr]); ptr +=1
b = int(input[ptr]); ptr +=1
a = list(map(int, input[ptr:ptr+n]))
ptr +=n
# Precompute f(c) for all c in 0..p-1
f = [0] * p
if p == 1:
# Edge case, but p >=2 in input
pass
else:
g = 1
if p != 1:
g = pow(k, p-2, p-1)
g = pow(k, g, p)
# Wait, no. Let's compute g = gcd(k, p-1)
g_val = gcd(k, p-1)
# Compute f(c)
f[0] = 1
if p-1 ==0:
# p=1, but input p >=2
pass
else:
e = (p-1) // g_val
for c in range(1, p):
res = pow(c, e, p)
if res ==1:
f[c] = g_val
else:
f[c] =0
# Precompute cnt_i for each a_i
cnt_list = []
zero_count =0
for ai in a:
if ai ==0:
zero_count +=1
continue
inv_ai = pow(ai, p-2, p)
cnt = [0]*p
for v in range(p):
c = (v * inv_ai) % p
cnt[v] = f[c]
cnt_list.append(cnt)
# Compute DP
dp = [0]*p
dp[0] =1
for cnt in cnt_list:
new_dp = [0]*p
for s in range(p):
if dp[s] ==0:
continue
for v in range(p):
if cnt[v] ==0:
continue
new_s = (s + v) % p
new_dp[new_s] = (new_dp[new_s] + dp[s] * cnt[v]) % MOD
dp = new_dp
# Multiply by p^zero_count mod MOD
ans = dp[b] * pow(p, zero_count, MOD) % MOD
print(ans)
def gcd(a, b):
while b:
a, b = b, a%b
return a
if __name__ == '__main__':
main()
gew1fw