結果
問題 | No.950 行列累乗 |
ユーザー | maspy |
提出日時 | 2019-12-14 00:12:40 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,354 bytes |
コンパイル時間 | 101 ms |
コンパイル使用メモリ | 13,184 KB |
実行使用メモリ | 71,600 KB |
最終ジャッジ日時 | 2024-06-27 23:07:11 |
合計ジャッジ時間 | 39,674 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 525 ms
44,964 KB |
testcase_01 | AC | 517 ms
44,580 KB |
testcase_02 | AC | 515 ms
44,964 KB |
testcase_03 | AC | 516 ms
44,576 KB |
testcase_04 | AC | 573 ms
44,456 KB |
testcase_05 | AC | 628 ms
55,276 KB |
testcase_06 | AC | 509 ms
44,580 KB |
testcase_07 | AC | 520 ms
44,836 KB |
testcase_08 | AC | 520 ms
44,832 KB |
testcase_09 | AC | 521 ms
44,704 KB |
testcase_10 | AC | 526 ms
44,960 KB |
testcase_11 | AC | 521 ms
44,836 KB |
testcase_12 | AC | 524 ms
44,708 KB |
testcase_13 | AC | 516 ms
44,832 KB |
testcase_14 | AC | 514 ms
45,096 KB |
testcase_15 | AC | 519 ms
44,964 KB |
testcase_16 | AC | 509 ms
44,580 KB |
testcase_17 | AC | 498 ms
44,460 KB |
testcase_18 | AC | 511 ms
44,328 KB |
testcase_19 | AC | 514 ms
44,712 KB |
testcase_20 | AC | 494 ms
44,960 KB |
testcase_21 | AC | 540 ms
46,856 KB |
testcase_22 | AC | 664 ms
66,128 KB |
testcase_23 | AC | 620 ms
56,432 KB |
testcase_24 | AC | 641 ms
61,620 KB |
testcase_25 | AC | 623 ms
58,748 KB |
testcase_26 | AC | 630 ms
62,912 KB |
testcase_27 | AC | 530 ms
45,096 KB |
testcase_28 | AC | 657 ms
64,184 KB |
testcase_29 | AC | 639 ms
61,768 KB |
testcase_30 | AC | 644 ms
62,132 KB |
testcase_31 | AC | 636 ms
61,324 KB |
testcase_32 | AC | 708 ms
70,760 KB |
testcase_33 | AC | 685 ms
63,708 KB |
testcase_34 | WA | - |
testcase_35 | AC | 658 ms
63,868 KB |
testcase_36 | AC | 503 ms
44,712 KB |
testcase_37 | AC | 523 ms
45,988 KB |
testcase_38 | AC | 530 ms
46,116 KB |
testcase_39 | AC | 521 ms
44,716 KB |
testcase_40 | AC | 670 ms
66,504 KB |
testcase_41 | AC | 650 ms
60,372 KB |
testcase_42 | AC | 546 ms
47,304 KB |
testcase_43 | AC | 721 ms
71,600 KB |
testcase_44 | WA | - |
testcase_45 | AC | 723 ms
71,344 KB |
testcase_46 | AC | 726 ms
71,092 KB |
testcase_47 | AC | 636 ms
62,796 KB |
testcase_48 | WA | - |
testcase_49 | AC | 722 ms
71,212 KB |
testcase_50 | AC | 720 ms
71,336 KB |
testcase_51 | AC | 711 ms
71,456 KB |
testcase_52 | AC | 522 ms
47,016 KB |
testcase_53 | AC | 530 ms
47,268 KB |
testcase_54 | AC | 514 ms
44,320 KB |
testcase_55 | AC | 521 ms
44,712 KB |
testcase_56 | AC | 528 ms
47,016 KB |
testcase_57 | AC | 663 ms
60,468 KB |
testcase_58 | AC | 520 ms
44,844 KB |
testcase_59 | AC | 517 ms
44,704 KB |
testcase_60 | AC | 509 ms
44,584 KB |
ソースコード
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(int(a),M,MOD) d = pow(int(a),MOD-2,MOD) 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 matrix_power(A,n,MOD): if n == 0: return np.eye(2,dtype=np.int64) B = matrix_power(A,n//2,MOD) B = np.dot(B,B) % MOD return np.dot(A,B) % MOD if n & 1 else B def matrix_inverse(A,MOD): # powerでもよいが det = (A[0,0]*A[1,1] - A[1,0]*A[0,1]) % MOD B = np.array([ [A[1,1],-A[0,1]], [-A[1,0],A[0,0]], ]) x = pow(int(det),MOD-2,MOD) B *= x; B %= MOD assert np.all(np.dot(A,B) % MOD == np.eye(2,dtype=np.int64)) return B 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 if (k * A % MOD != B).any(): return -1 if k == 1: return 1 n = BSGS(trA,k,MOD) return -1 if n == -1 else n + 1 # det A == 1 に帰着したい n = BSGS(detA,detB,MOD) e = BSGS(detA,pow(int(detA),MOD-2,MOD),MOD) + 1 if n == -1: return -1 Ainv = matrix_inverse(A,MOD) B = np.dot(B,matrix_power(Ainv,n,MOD)) % MOD A = matrix_power(A,e,MOD) if n == 0 and np.all(B == np.eye(2,dtype=np.int64)): k = solve_SL2(A,Ainv,MOD) + 1 return k k = solve_SL2(A,B,MOD) if k == -1: return -1 return e * k + n def to_hash(A): A = A.astype(object) return (A[:,0,0] << 96) + (A[:,1,0] << 64) + (A[:,0,1] << 32) + (A[:,1,1]) def solve_SL2(A,B,MOD): """ A の固有値を考えると、Aの位数は十分小さいことが分かる F_pで2固有値 → p-1周期 F_{p^2}で2固有値 → ノルム1にしたのでp+1周期 固有値が重複 → 2乗すると固有値が1 → 2p周期 2p程度で、BGSGをすればよい """ U = 2 * MOD M = int(U ** .5 + 100) c = matrix_power(A,M,MOD) d = matrix_inverse(A,MOD) Baby = make_power_mat(d,M,MOD) Giant = make_power_mat(c,M,MOD) BB = np.zeros((M,2,2),np.int64) for i,j in itertools.product(range(2),repeat=2): BB[:,i,j] = (Baby[:,i,:] * B[:,j][None,:] % MOD).sum(axis=1) % MOD Gh = to_hash(Giant).tolist() BBh = to_hash(BB).tolist() se = set(BBh) q = -1 for i,g in enumerate(Gh): if g in se: q = i break if q == -1: return -1 g = Gh[q] r = -1 for i,b in enumerate(BBh): if b == g: r = i break return q * M + r print(solve(A,B,MOD))