#include #include #include using namespace std; #define NLIMIT 1000000 #define TLIMIT 100000 #define MLIMIT 1000000000 #define QLIMIT 200000 #define N (NLIMIT + 100) int MOD; int nsum = 0, qsum = 0; int ST[N<<4]; int expmod(int a, int b) { long long x = 1, y = a; while(b) { if(b & 1) { x = x * y % MOD; } y = y * y % MOD; b >>= 1; } return (int) x; } void build(int cur, int s, int e) { if(s == e-1) { ST[cur] = (s+1) % MOD; return; } int m = (s+e)>>1, c1 = cur << 1, c2 = c1 | 1; build(c1, s, m); build(c2, m, e); ST[cur] = ((long long)ST[c1] * ST[c2]) % MOD; } int query(int cur, int s, int e, int S, int E) { if(s >= E || e <= S) return 1; if(s >= S && e <= E) return ST[cur]; int m = (s+e)>>1, c1 = cur << 1, c2 = c1 | 1; return ((long long)query(c1, s, m, S, E) * query(c2, m, e, S, E)) % MOD; } int firstPart[N], lastPart[N]; void solveTestCase() { int n, q; scanf("%d%d%d", &n, &MOD, &q); assert(2 <= n && n <= NLIMIT); assert(1 <= MOD && MOD <= MLIMIT); assert(2 <= q && q <= QLIMIT); nsum += n; qsum += q; firstPart[0] = 1; for(int i=1; i<=n/2; i++) { firstPart[i] = ((long long)firstPart[i-1] * expmod(i, i-1)) % MOD; } lastPart[n] = n; for(int i=n-1; i>=n/2; i--) { lastPart[i] = ((long long)lastPart[i+1] * expmod(i, n - i + 1)) % MOD; } build(1, 0, n); for(int i=0; i