int n, m, len; int f[kMaxN][kMaxN][kMaxN]; std::string s;
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
structMatrix { int n, m, a[kMaxM][kMaxM];
voidset(int _n, int _m){ n = _n, m = _m; } friend Matrix operator*(const Matrix &m1, const Matrix &m2) { static Matrix ret; assert(m1.m == m2.n); ret.set(m1.n, m2.m); for (int i = 1; i <= m1.n; ++i) { for (int j = i; j <= m2.m; ++j) { ret.a[i][j] = 0; for (int k = i; k <= j; ++k) inc(ret.a[i][j], 1ll * m1.a[i][k] * m2.a[k][j] % kMod); } } return ret; } } M, S, O;
voidprework(){ len = n + m; for (int i = 0; i <= n + 1; ++i) for (int j = 0; j < i; ++j) f[i][j][0] = 1; for (int len = 1; len <= n; ++len) { for (int i = 1; i <= n - len + 1; ++i) { int j = i + len - 1; for (int k = 0; k <= n; ++k) { if (s[i] == s[j]) inc(f[i][j][k], f[i + 1][j - 1][k]); else inc(f[i][j][k + 1], add(f[i][j - 1][k], f[i + 1][j][k])); } } } }
intcalc(int l, int r, int k){ staticint f[kMaxN][kMaxN][kMaxN] = {0}; staticbool vis[kMaxN][kMaxN][kMaxN] = {0}; if (l >= r || k < 0) return0; elseif (l + 1 == r && s[l] == s[r]) return !k; elseif (vis[l][r][k]) return f[l][r][k]; vis[l][r][k] = 1; if (s[l] == s[r]) f[l][r][k] = calc(l + 1, r - 1, k); else f[l][r][k] = add(calc(l, r - 1, k - 1), calc(l + 1, r, k - 1)); return f[l][r][k]; }
Matrix qpow(Matrix bs, int idx){ Matrix ret = bs; --idx; for (; idx; idx >>= 1, bs = bs * bs) if (idx & 1) ret = ret * bs; return ret; }
voiddickdreamer(){ std::cin >> s >> m; n = s.size(), s = " " + s; prework(); for (int i = 0; i <= n; ++i) std::cerr << f[1][n][i] << ' '; int cnt24 = n - 1, cnt25 = (n + 1) / 2, sz = cnt24 + 2 * cnt25; M.set(sz, sz), S.set(1, sz); for (int i = 1; i <= cnt24; ++i) M.a[i][i] = 24; for (int i = cnt24 + 1; i <= cnt24 + cnt25; ++i) M.a[i][i] = 25; for (int i = cnt24 + cnt25 + 1; i <= sz; ++i) M.a[i][i] = 26; for (int i = 1; i < cnt24 + cnt25; ++i) M.a[i][i + 1] = 1; for (int i = cnt24 + 1; i <= cnt24 + cnt25; ++i) M.a[i][i + cnt25] = 1; auto tmp = qpow(M, len / 2); int ans = 0; if (len & 1) { for (int i = 0; i <= cnt24; ++i) { dec(ans, 1ll * calc(1, n, i) * tmp.a[cnt24 - i + 1][cnt24 + (n - i) / 2] % kMod); } tmp = tmp * M; } for (int i = 0; i <= cnt24; ++i) { inc(ans, 1ll * f[1][n][i] * tmp.a[cnt24 - i + 1][cnt24 + cnt25 + (n - i + 1) / 2] % kMod); } std::cout << ans << '\n'; }