// yukicoder: No.147 試験監督(2) // 2019.4.11 bal4u #include #include //// 高速入力 #if 1 #define gc() getchar_unlocked() #else #define gc() getchar() #endif long long in() { int c = gc(); long long n = 0; do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0'); return n; } int ins(char *s) { char c, *p = s; do c = gc(), *s-- = c & 0xf; while (c > ' '); return p - ++s; } #define MOD 1000000007 //// fibonacci数の高速計算 void multiply(int F[2][2], int M[2][2]) { int x = ((long long)F[0][0] * M[0][0] + (long long)F[0][1] * M[1][0]) % MOD; int y = ((long long)F[0][0] * M[0][1] + (long long)F[0][1] * M[1][1]) % MOD; int z = ((long long)F[1][0] * M[0][0] + (long long)F[1][1] * M[1][0]) % MOD; int w = ((long long)F[1][0] * M[0][1] + (long long)F[1][1] * M[1][1]) % MOD; F[0][0] = x; F[0][1] = y; F[1][0] = z; F[1][1] = w; } void power(int F[2][2], long long n) { int M[2][2] = { {1,1},{1,0} }; if (n == 0 || n == 1) return; power(F, n >> 1); multiply(F, F); if (n & 1) multiply(F, M); } int fib(long long n) { int F[2][2] = { {1,1},{1,0} }; if (n == 0) return 0; power(F, n - 1); return F[0][0]; } //// 10進数を2進数に変換 int dec2bin(char *bin, int dlen, char *dec) { int i; int d, r; int blen; int non_zero; blen = 0; do { r = 0; non_zero = 0; for (i = dlen - 1; i >= 0; i--) { d = dec[i]; dec[i] = d >> 1; if (r > 0) dec[i] += 5; if (dec[i] > 0) non_zero = 1; r = d & 1; } bin[blen++] = r; } while (non_zero); return blen; } // calc b^p (mod m) int big_mod(int b, int len, char *p) { long long s = 1; long long d; d = b % MOD; while (len > 0) { if (*p & 1) s = (s * d) % MOD; p++, len--; d = (d * d) % MOD; } return (int)s; } char d[210]; int wd; // 10進数 char b[600]; int wb; // 2進数 int main() { int n, c; long long ans; n = (int)in(); ans = 1; while (n--) { c = fib(in() + 2); wd = ins(d+205); wb = dec2bin(b, wd, 206+d-wd); ans = (ans * big_mod(c, wb, b)) % MOD; } printf("%d\n", (int)ans); return 0; }