#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
typedef long long ll;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline ll read() {
ll x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=1000010;
const int mod=19930726;
char ch[maxn];
ll pow(int a,ll n) {
if(!n) return 1;
ll ans=pow(a,n>>1);(ans*=ans)%=mod;
if(n&1) (ans*=a)%=mod;
return ans;
}
struct PAM {
int to[maxn][26],f[maxn],l[maxn],siz[maxn],last,cnt;
PAM() {f[0]=f[1]=cnt=1;l[1]=-1;}
void extend(int c,int n) {
int p=last;
while(ch[n]!=ch[n-l[p]-1]) p=f[p];
if(!to[p][c]) {
int k=f[p],np=++cnt;l[np]=l[p]+2;
while(ch[n]!=ch[n-l[k]-1]) k=f[k];
f[np]=to[k][c];to[p][c]=np;
}
siz[last=to[p][c]]++;
}
int first[maxn],next[maxn],To[maxn],e;
void Add(int x,int v) {
To[++e]=v;next[e]=first[x];first[x]=e;
}
ll solve(ll n,ll k) {
ll tot=0,ans=1;
dwn(i,cnt,2) {
siz[f[i]]+=siz[i];
if(l[i]&1) tot+=siz[i],Add(l[i],i);
}
if(tot<k) return -1;
dwn(x,n,1) ren {
ll v=siz[To[i]];
(ans*=pow(x,min(k,v)))%=mod;
k-=min(k,v);if(!k) break;
}
return ans;
}
}sol;
int main() {
ll n=read(),k=read();scanf("%s",ch+1);
rep(i,1,n) sol.extend(ch[i]-‘a‘,i);
printf("%lld\n",sol.solve(n,k));
return 0;
}