NTT calc; char s[MAX], ch[2]; voidsolve() { scanf("%s%s", s + 1, ch + 1); int n = strlen(s + 1), a = 0, b = 0, p = 0; // a must change b (pairs) change should be pair p careless for (int i = 1; i <= (n + 1) / 2; ++i) { if (i == n - i + 1) {++p; continue;} if (s[i] == s[n - i + 1]) { if (s[i] == ch[1]) p += 2; else ++b; } else { if (s[i] == ch[1] || s[n - i + 1] == ch[1]) ++p, ++a; else a += 2; } } if (!a) {puts("0"); return;} vector <int> frac(n + 1, 1), inv(n + 1, 1); int ans = 0, tot = 0; auto qpow = [&] (int x, int y) -> int { int res = 1; while (y) { if (y & 1) res = 1ll * res * x % MOD; x = 1ll * x * x % MOD; y >>= 1; } return res; }; auto comb = [&] (int x, int y) -> int {return x < y ? 0 : 1ll * frac[x] * inv[y] % MOD * inv[x - y] % MOD;}; for (int i = 1; i <= n; ++i) frac[i] = 1ll * frac[i - 1] * i % MOD; inv[n] = qpow(frac[n], MOD - 2); for (int i = n - 1; i >= 1; --i) inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD; // for (int i = 0; i <= b; ++i) // { // F[i] = frac[2 * i + a]; // for (int j = 0; j < i; ++j) F[i] = (1ll * F[i] - 1ll * comb(i, j) * F[j] % MOD * frac[2 * (i - j)] % MOD + MOD) % MOD; // } vector <int> A(b + 1), B(b + 1); for (int i = 0; i <= b; ++i) A[i] = 1ll * frac[2 * i] * inv[i] % MOD, B[i] = 1ll * frac[2 * i + a] * inv[i] % MOD; auto C = calc.Inv(A, b + 1); auto F = calc.Conv(B, C); for (int i = 0; i <= b; ++i) F[i] = 1ll * F[i] * frac[i] % MOD; for (int i = 0; i <= b; ++i) F[i] = 1ll * F[i] * comb(b, i) % MOD * frac[2 * (b - i)] % MOD, tot = (tot + F[i]) % MOD; assert (tot == frac[2 * b + a]); for (int i = 0; i <= b; ++i) ans = (ans + 2ll * i * F[i] % MOD * inv[2 * b + a] % MOD) % MOD; for (int i = 0; i <= b; ++i) ans = (ans + 1ll * F[i] * p % MOD * (a + 2 * i) % MOD * qpow(a + 2 * b + 1, MOD - 2) % MOD * inv[2 * b + a] % MOD) % MOD; ans = (ans + a) % MOD; printf("%d\n", ans); } intmain() { int t = 1; while (t--) solve(); return0; }