#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
long long modpow(long long a, long long e){
long long r = 1;
while(e){
if(e&1) r = (r*a)%MOD;
a = (a*a)%MOD;
e >>= 1;
}
return r;
}
static int dp2[2005][2005];
static int dp3[105][105][105];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, k;
if(!(cin >> N >> k)) return 0;
string S;
cin >> S;
if(k==1){
cout << modpow(2, N) % MOD;
return 0;
}
if(k==2){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(S[i-1]==S[j-1]){
long long v = dp2[i-1][j] + dp2[i][j-1];
v %= MOD;
v = (v + 1) % MOD;
dp2[i][j] = (int)v;
}else{
long long v = dp2[i-1][j] + dp2[i][j-1];
v %= MOD;
v = (v - dp2[i-1][j-1]) % MOD;
if(v<0) v += MOD;
dp2[i][j] = (int)v;
}
}
}
int ans = dp2[N][N];
ans++;
if(ans>=MOD) ans-=MOD;
cout << ans;
return 0;
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
for(int k3=1;k3<=N;k3++){
long long v = dp3[i-1][j][k3];
v += dp3[i][j-1][k3];
if(v>=MOD) v-=MOD;
v += dp3[i][j][k3-1];
v %= MOD;
v -= dp3[i-1][j-1][k3];
if(v<0) v+=MOD;
v -= dp3[i-1][j][k3-1];
if(v<0) v+=MOD;
v -= dp3[i][j-1][k3-1];
if(v<0) v+=MOD;
v += dp3[i-1][j-1][k3-1];
v %= MOD;
if(S[i-1]==S[j-1] && S[i-1]==S[k3-1]){
v += 1 + dp3[i-1][j-1][k3-1];
v %= MOD;
}
dp3[i][j][k3] = (int)v;
}
}
}
int ans = dp3[N][N][N];
ans++;
if(ans>=MOD) ans-=MOD;
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTU9EID0gMTAwMDAwMDAwNzsKCmxvbmcgbG9uZyBtb2Rwb3cobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBlKXsKICAgIGxvbmcgbG9uZyByID0gMTsKICAgIHdoaWxlKGUpewogICAgICAgIGlmKGUmMSkgciA9IChyKmEpJU1PRDsKICAgICAgICBhID0gKGEqYSklTU9EOwogICAgICAgIGUgPj49IDE7CiAgICB9CiAgICByZXR1cm4gcjsKfQoKc3RhdGljIGludCBkcDJbMjAwNV1bMjAwNV07CnN0YXRpYyBpbnQgZHAzWzEwNV1bMTA1XVsxMDVdOwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgTiwgazsKICAgIGlmKCEoY2luID4+IE4gPj4gaykpIHJldHVybiAwOwogICAgc3RyaW5nIFM7CiAgICBjaW4gPj4gUzsKICAgIGlmKGs9PTEpewogICAgICAgIGNvdXQgPDwgbW9kcG93KDIsIE4pICUgTU9EOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYoaz09Mil7CiAgICAgICAgZm9yKGludCBpPTE7aTw9TjtpKyspewogICAgICAgICAgICBmb3IoaW50IGo9MTtqPD1OO2orKyl7CiAgICAgICAgICAgICAgICBpZihTW2ktMV09PVNbai0xXSl7CiAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHYgPSBkcDJbaS0xXVtqXSArIGRwMltpXVtqLTFdOwogICAgICAgICAgICAgICAgICAgIHYgJT0gTU9EOwogICAgICAgICAgICAgICAgICAgIHYgPSAodiArIDEpICUgTU9EOwogICAgICAgICAgICAgICAgICAgIGRwMltpXVtqXSA9IChpbnQpdjsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyB2ID0gZHAyW2ktMV1bal0gKyBkcDJbaV1bai0xXTsKICAgICAgICAgICAgICAgICAgICB2ICU9IE1PRDsKICAgICAgICAgICAgICAgICAgICB2ID0gKHYgLSBkcDJbaS0xXVtqLTFdKSAlIE1PRDsKICAgICAgICAgICAgICAgICAgICBpZih2PDApIHYgKz0gTU9EOwogICAgICAgICAgICAgICAgICAgIGRwMltpXVtqXSA9IChpbnQpdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnQgYW5zID0gZHAyW05dW05dOwogICAgICAgIGFucysrOwogICAgICAgIGlmKGFucz49TU9EKSBhbnMtPU1PRDsKICAgICAgICBjb3V0IDw8IGFuczsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZvcihpbnQgaT0xO2k8PU47aSsrKXsKICAgICAgICBmb3IoaW50IGo9MTtqPD1OO2orKyl7CiAgICAgICAgICAgIGZvcihpbnQgazM9MTtrMzw9TjtrMysrKXsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyB2ID0gZHAzW2ktMV1bal1bazNdOwogICAgICAgICAgICAgICAgdiArPSBkcDNbaV1bai0xXVtrM107CiAgICAgICAgICAgICAgICBpZih2Pj1NT0QpIHYtPU1PRDsKICAgICAgICAgICAgICAgIHYgKz0gZHAzW2ldW2pdW2szLTFdOwogICAgICAgICAgICAgICAgdiAlPSBNT0Q7CiAgICAgICAgICAgICAgICB2IC09IGRwM1tpLTFdW2otMV1bazNdOwogICAgICAgICAgICAgICAgaWYodjwwKSB2Kz1NT0Q7CiAgICAgICAgICAgICAgICB2IC09IGRwM1tpLTFdW2pdW2szLTFdOwogICAgICAgICAgICAgICAgaWYodjwwKSB2Kz1NT0Q7CiAgICAgICAgICAgICAgICB2IC09IGRwM1tpXVtqLTFdW2szLTFdOwogICAgICAgICAgICAgICAgaWYodjwwKSB2Kz1NT0Q7CiAgICAgICAgICAgICAgICB2ICs9IGRwM1tpLTFdW2otMV1bazMtMV07CiAgICAgICAgICAgICAgICB2ICU9IE1PRDsKICAgICAgICAgICAgICAgIGlmKFNbaS0xXT09U1tqLTFdICYmIFNbaS0xXT09U1trMy0xXSl7CiAgICAgICAgICAgICAgICAgICAgdiArPSAxICsgZHAzW2ktMV1bai0xXVtrMy0xXTsKICAgICAgICAgICAgICAgICAgICB2ICU9IE1PRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRwM1tpXVtqXVtrM10gPSAoaW50KXY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpbnQgYW5zID0gZHAzW05dW05dW05dOwogICAgYW5zKys7CiAgICBpZihhbnM+PU1PRCkgYW5zLT1NT0Q7CiAgICBjb3V0IDw8IGFuczsKICAgIHJldHVybiAwOwp9Cg==