typedeflonglong ll; constint N = 10000020, p = N - 1; int a[N], q; ll n;
intfpow(int a, int b){ int res = 1; for (; b; b >>= 1, a = a * 1ll * a % p) if (b & 1) res = res * 1ll * a % p; return res; } intC(ll n, ll m){ if (m > n) return0; return a[n] * 1ll * fpow(a[n - m], p - 2) % p * 1ll * fpow(a[m], p - 2) % p; } intsolve(ll n, ll m){ if (m == 0) return1; returnsolve(n / p, m / p) * 1ll * C(n % p, m % p) % p; }
intmain(){ scanf("%lld %d", &n, &q); a[0] = 1; for (int i = 1; i <= p; i++) a[i] = a[i - 1] * 1ll * i % p; ll len = 0, two = 1, pp = 0; for (int i = 0; 1 <= (n >> i); i++) { ll l = n >> (i + 1), r = n >> i, cnt = ((r + 1) >> 1) - ((l + 1) >> 1); if (i & 1) len += ((i + 1) >> 1) * cnt, two = two * fpow(2, cnt % (p - 1)) % p; else len += (i >> 1) * cnt, pp += cnt; } while (q--) { ll x; scanf("%lld", &x); if (x < len || x > len + pp) puts("0"); elseprintf("%lld\n", solve(pp, x - len) * two % p); } return0; }
intsolve(constchar *s, constchar *sr){ for (int i = 1; i <= n; i++) { ms[i * 2] = s[i]; ms[i * 2 - 1] = '#'; } ms[n + n + 1] = '#', ms[0] = '&'; mid = 0, rad = 0; for (int i = 1; i <= n + n + 1; i++) { r[i] = 0; if (i <= mid + rad) r[i] = min(r[mid + mid - i], mid + rad - i); for (; ms[i - r[i] - 1] == ms[i + r[i] + 1]; r[i]++); if (i + r[i] > mid + rad) mid = i, rad = r[i]; } int j = 0; for (int i = 2; i <= n; i++) { while (j && s[j + 1] != s[i]) j = f[j]; j += s[j + 1] == s[i]; f[i] = j; } memset(mx, 0, sizeof mx); j = 0; for (int i = 2; i <= n; i++) { while (j && s[j + 1] != sr[i]) j = f[j]; j += s[j + 1] == sr[i]; g[i] = j; mx[i] = max(mx[i - 1], g[i]); } int res = 0; for (int i = 0; i <= n; i++) { int len = (r[i + i + 1] / 2), k = g[n - i - len]; res = max(res, r[i + i + 1] + 2 * min(k, i - len)); if (mx[n - i - len] >= i - len) res = max(res, r[2 * i + 1] + i + i - len - len); } for (int i = 1; i <= n; i++) { int len = (r[i + i] / 2), k = g[n - i - len]; res = max(res, r[i + i] + 2 * min(k, i - len - 1)); if (mx[n - i - len] >= i - len - 1) res = max(res, r[2 * i] + i + i - len - len - 2); } return res; }
intmain(){ scanf("%s", s + 1); n = strlen(s + 1); int l = 1, r = n, p = 0; while (l + 1 < r && s[l] == s[r]) l++, r--, p++, p++; for (int i = l; i <= r; i++) s[i + 1 - l] = s[i]; n -= p; for (int i = 1; i <= n; i++) sr[i] = s[n - i + 1]; returnprintf("%d\n", max(solve(s, sr), solve(sr, s)) + p), 0; }