結果
| 問題 |
No.950 行列累乗
|
| コンテスト | |
| ユーザー |
maspy
|
| 提出日時 | 2019-12-13 23:11:00 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,224 bytes |
| コンパイル時間 | 101 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 44,800 KB |
| 最終ジャッジ日時 | 2024-06-27 20:36:39 |
| 合計ジャッジ時間 | 34,510 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 RE * 3 |
| other | AC * 3 RE * 54 |
ソースコード
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import numpy as np
import itertools
MOD = int(readline())
data = list(map(int,read().split()))
A = np.int64(data[:4]).reshape(2,2)
B = np.int64(data[4:]).reshape(2,2)
def make_power_mat(A, L, MOD=MOD):
N = A.shape[0]
assert A.shape == (N,N)
B = L.bit_length()
x = np.empty((1<<B,N,N), np.int64)
x[0] = np.eye(N,dtype=np.int64)
X = A.copy()
for n in range(B):
for i,j in itertools.product(range(N),repeat=2):
x[1<<n:1<<(n+1),i,j] = (x[:1<<n,i,:] * X[:,j] % MOD).sum(axis=1) % MOD
Y = X.copy()
for i,j in itertools.product(range(N),repeat=2):
X[i,j] = (Y[i,:] * Y[:,j] % MOD).sum() % MOD
return x[:L]
def make_power(a, L, MOD=MOD):
B = L.bit_length()
x = np.empty((1<<B), np.int64)
x[0] = 1
for n in range(B):
x[1<<n:1<<(n+1)] = x[:1<<n] * a % MOD
a *= a; a %= MOD
return x[:L]
def BSGS(a,b,MOD):
assert a != 0
M = int(MOD ** .5 + 100)
c = pow(a,M,MOD)
d = pow(a,MOD-2,MOD)
print(c,d,M)
B = make_power(d,M,MOD)
G = make_power(c,M,MOD)
I = np.in1d(G, b * B % MOD)
if not I.any():
return -1
q = np.where(I)[0][0]
r = np.where(b * B % MOD == G[q])[0][0]
return q * M + r
def solve_naive(A,B,MOD):
X = np.int64([[1,0],[0,1]])
for n in range(1,10**4):
X = np.dot(X,A) % MOD
if (X == B).all():
return n
return -1
def solve(A,B,MOD):
if MOD == 2:
return solve_naive(A,B,MOD)
detA = (A[0,0]*A[1,1] - A[1,0]*A[0,1]) % MOD
detB = (B[0,0]*B[1,1] - B[1,0]*B[0,1]) % MOD
trA = (A[0,0] + A[1,1]) % MOD
if detA == 0 and trA == 0:
# べき零
if (A == B).all():
return 1
if (B == 0).all():
return 2
return -1
if detA == 0:
# A^n = t^{n-1}A
I,J = np.where(A != 0); i = I[0]; j = J[0]
a = A[i,j]; b = B[i,j]
k = b * pow(int(a),MOD-2,MOD) % MOD
assert a * k % MOD == b
n = BGSG(trA,k,MOD)
return -1 if n == -1 else n + 1
raise Exception
print(solve(A,B,MOD))
maspy