From 41cf2ab68a09a024d24c4cc48033f39135749382 Mon Sep 17 00:00:00 2001 From: Ankur Sundara Date: Sat, 11 Mar 2017 00:32:58 -0600 Subject: [PATCH] Create grader.py --- library/grader.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 library/grader.py diff --git a/library/grader.py b/library/grader.py new file mode 100644 index 0000000..fcccfc1 --- /dev/null +++ b/library/grader.py @@ -0,0 +1,39 @@ +x = input() + +mat = [[0,0,1,0],[0,1,0,1],[1,0,2,0],[0,2,0,1]] +mod = 10**9+7 + +def egcd(a, b): + if a == 0: + return (b, 0, 1) + else: + g, y, x = egcd(b % a, a) + return (g, x - (b // a) * y, y) + +def modinv(a, m): + g, x, y = egcd(a, m) + if g != 1: + raise Exception('modular inverse does not exist') + else: + return x % m + +def matmult(mtx_a, mtx_b, mod): + tpos_b = zip( *mtx_b) + rtn = [[ sum( ea*eb for ea,eb in zip(a,b))%mod for b in tpos_b] for a in mtx_a] + return rtn + +def trace(A): + return sum(A[j][j] for j in range(len(A))) + +def matpow(A, p): + ret = A + for bit in bin(p)[3:]: + ret = matmult(ret, ret, mod) + if bit=='1': + ret = matmult(ret, A, mod) + return ret + +inv4 = modinv(4, mod) +ans = trace(matpow(mat, x))%mod +ans = (ans * inv4)% mod +print ans