結果
問題 |
No.950 行列累乗
|
ユーザー |
![]() |
提出日時 | 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))