#include #include #include #include using namespace std; struct IN{} in; #define cin in inline bool delim(char &c) { return c == ' ' || c == '\n' || c == '\r'; } template inline IN& operator>>(IN& t, T& a) { char buf; a = 0; while (delim(buf = getchar())); if (buf == '-') { t >> a; a = -a; return t; } while (true){ a *= 10; a += buf - '0'; if (delim(buf = getchar())) break; } return t; } const int N = 1000020; const int M = 21; const int Q = 2e7 + 256, Q64 = (Q >> 6); int tl[M][N]; int tr[M][N]; int a[N]; int p, add[N]; int main() { //freopen("input.txt","r",stdin); //freopen("outputSol.txt","w",stdout); ios_base::sync_with_stdio(0); int t; cin >> t; while (t--) { int n; int q; cin >> n >> p >> q; for (int i = 0; i != n; ++i) { cin >> a[i]; } int cnt = (q >> 6) + 2; for (int i = 0; i < cnt; ++i) { cin >> add[i]; } for (int j = 0; ; ++j) { int sz = 1 << j; if (sz > n) break; int ones = (sz - 1); long long tmp = 1; for (int i = 0; i != n; ++i) { tmp *= a[i]; tmp %= p; tl[j][i] = tmp; if ((i & ones) == ones) tmp = 1; } tmp = 1; for (int i = n - 1; i != -1; --i) { tmp *= a[i]; tmp %= p; tr[j][i] = tmp; if ((i & ones) == 0) tmp = 1; } } int prev = 0; int cnst = (1 << 6) - 1, l(0), r(0); for (int i = 0; i < q; ++i) { if ((i & cnst) == 0) { l = add[(i >> 6)] + prev; r = add[(i >> 6) + 1] + prev; } else { l += prev; r += prev; } l %= n; r %= n; if (l > r) swap(l, r); long long ans; if (l == r) { ans = a[l]; } else { int num = 31 - __builtin_clz(l ^ r); ans = tl[num][r]; ans *= tr[num][l]; } ans = (ans + 1) % p; prev = ans; } cout << prev << "\n"; } cerr << clock() / static_cast(CLOCKS_PER_SEC) << "\n"; }