// template : rjohari23
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#define getcx getchar_unlocked
#define pc(x) putchar_unlocked(x);
#ifndef ONLINE_JUDGE
#define getcx getchar
#endif
using namespace std;
#define clear(a) memset((a),0,sizeof(a))
#define pb push_back
#define SIZE(v) v.size()
#define ull unsigned long long int
#define lli long long int
#define li long int
#define ii int
//#define mod 1000000007
inline int inp()
{
int n=0;
int ch=getcx();int sign=1;
while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getcx();}
while( ch >= '0' && ch <= '9' )
n = (n<<3)+(n<<1) + ch-'0', ch=getcx();
return n*sign;
}
inline long long in()
{
long long n=0;
long long ch=getcx();long long sign=1;
while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getcx();}
while( ch >= '0' && ch <= '9' )
n = (n<<3)+(n<<1) + ch-'0', ch=getcx();
return n*sign;
}
inline void write (lli n)
{
lli N = n, rev, count = 0;
rev = N;
if (N == 0) { pc('0');return ;}
while ((rev % 10) == 0) { count++; rev /= 10;} //obtain the count of the number of 0s
rev = 0;
while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;} //store reverse of N in rev
while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
while (count--) pc('0');
}
/* http://d...content-available-to-author-only...f.com/questions/20106/fast-string-input */
/* fast string input using getchar_unlocked */
inline string ip()
{
string s = "";
int temp=getchar_unlocked();
while ( temp<'A'||temp>'Z' )
temp = getchar_unlocked();
while ( temp>='A'&&temp<='Z' )
{
s += (char)temp;
temp = getchar_unlocked();
}
return s;
}
#define lim 1000001
using namespace std;
ii N,mod;
int A[lim][4][4];
void solve()
{
int i,mx,mn;
for ( i=N;i>=0;--i )
{
for( mx=0;mx<=2;++mx )
{
for ( mn=0;mn<=2;++mn )
{
if ( i==N )
{
A[i][mx][mn] = 1;
continue;
}
A[i][mx][mn] = A[i+1][mx+1][max(0,mn-1)]+A[i+1][max(0,mx-1)][mn+1];
A[i][mx][mn] -= A[i][mx][mn] >= mod ? mod : 0;
}
}
}
}
string s;
inline ii query()
{
int idx,i,mx,mn;
mx = 0, mn = 0;
idx = 0;
for ( i=0;i<N;++i )
{
if ( s[i]=='L' )
{
mx = max(0,mx-1);
mn++;
continue;
}
idx += A[i+1][max(0,mx-1)][mn+1];
idx -= idx >= mod ? mod : 0;
mx += 1;
mn = max(0,mn-1);
}
idx += 1;
idx -= idx >= mod ? mod : 0;
return idx;
}
int main()
{
N = inp(); mod = inp();
s = ip();
solve();
write(query());
return 0;
}
Ly8gdGVtcGxhdGUgOiByam9oYXJpMjMKCiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxjc3RkaW8+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTx2ZWN0b3I+CiNkZWZpbmUgZ2V0Y3ggZ2V0Y2hhcl91bmxvY2tlZAojZGVmaW5lIHBjKHgpIHB1dGNoYXJfdW5sb2NrZWQoeCk7CiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICAjZGVmaW5lIGdldGN4IGdldGNoYXIKI2VuZGlmCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgY2xlYXIoYSkgbWVtc2V0KChhKSwwLHNpemVvZihhKSkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBTSVpFKHYpIHYuc2l6ZSgpCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKI2RlZmluZSBsbGkgbG9uZyBsb25nIGludAojZGVmaW5lIGxpIGxvbmcgaW50CiNkZWZpbmUgaWkgaW50Ci8vI2RlZmluZSBtb2QgMTAwMDAwMDAwNwoKaW5saW5lIGludCBpbnAoKQp7CiAgIGludCBuPTA7CiAgIGludCBjaD1nZXRjeCgpO2ludCBzaWduPTE7CiAgIHdoaWxlKCBjaCA8ICcwJyB8fCBjaCA+ICc5JyApe2lmKGNoPT0nLScpc2lnbj0tMTsgY2g9Z2V0Y3goKTt9CiAKICAgd2hpbGUoICBjaCA+PSAnMCcgJiYgY2ggPD0gJzknICkKICAgICAgICAgICBuID0gKG48PDMpKyhuPDwxKSArIGNoLScwJywgY2g9Z2V0Y3goKTsKICAgcmV0dXJuIG4qc2lnbjsKfQoKaW5saW5lIGxvbmcgbG9uZyBpbigpCnsKICAgbG9uZyBsb25nIG49MDsKICAgbG9uZyBsb25nIGNoPWdldGN4KCk7bG9uZyBsb25nIHNpZ249MTsKICAgd2hpbGUoIGNoIDwgJzAnIHx8IGNoID4gJzknICl7aWYoY2g9PSctJylzaWduPS0xOyBjaD1nZXRjeCgpO30KIAogICB3aGlsZSggIGNoID49ICcwJyAmJiBjaCA8PSAnOScgKQogICAgICAgICAgIG4gPSAobjw8MykrKG48PDEpICsgY2gtJzAnLCBjaD1nZXRjeCgpOwogICByZXR1cm4gbipzaWduOwp9CgppbmxpbmUgdm9pZCB3cml0ZSAobGxpIG4pCnsKICAgIGxsaSBOID0gbiwgcmV2LCBjb3VudCA9IDA7CiAgICByZXYgPSBOOwogICAgaWYgKE4gPT0gMCkgeyBwYygnMCcpO3JldHVybiA7fQogICAgd2hpbGUgKChyZXYgJSAxMCkgPT0gMCkgeyBjb3VudCsrOyByZXYgLz0gMTA7fSAvL29idGFpbiB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiAwcwogICAgcmV2ID0gMDsKICAgIHdoaWxlIChOICE9IDApIHsgcmV2ID0gKHJldjw8MykgKyAocmV2PDwxKSArIE4gJSAxMDsgTiAvPSAxMDt9ICAvL3N0b3JlIHJldmVyc2Ugb2YgTiBpbiByZXYKICAgIHdoaWxlIChyZXYgIT0gMCkgeyBwYyhyZXYgJSAxMCArICcwJyk7IHJldiAvPSAxMDt9CiAgICB3aGlsZSAoY291bnQtLSkgcGMoJzAnKTsKfQoKLyogaHR0cDovL2QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmYuY29tL3F1ZXN0aW9ucy8yMDEwNi9mYXN0LXN0cmluZy1pbnB1dCAqLwovKiBmYXN0IHN0cmluZyBpbnB1dCB1c2luZyBnZXRjaGFyX3VubG9ja2VkICovCmlubGluZSBzdHJpbmcgaXAoKQp7CiAgICBzdHJpbmcgcyA9ICIiOwogICAgaW50IHRlbXA9Z2V0Y2hhcl91bmxvY2tlZCgpOwogICAgd2hpbGUgKCB0ZW1wPCdBJ3x8dGVtcD4nWicgKQogICAgICAgIHRlbXAgPSBnZXRjaGFyX3VubG9ja2VkKCk7CiAgICB3aGlsZSAoIHRlbXA+PSdBJyYmdGVtcDw9J1onICkKICAgIHsKICAgICAgICBzICs9IChjaGFyKXRlbXA7CiAgICAgICAgdGVtcCA9IGdldGNoYXJfdW5sb2NrZWQoKTsKICAgIH0KICAgIHJldHVybiBzOwp9CgojZGVmaW5lIGxpbSAxMDAwMDAxCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppaSBOLG1vZDsKaW50IEFbbGltXVs0XVs0XTsKCnZvaWQgc29sdmUoKQp7CglpbnQgaSxteCxtbjsKCglmb3IgKCBpPU47aT49MDstLWkgKQoJewoJCWZvciggbXg9MDtteDw9MjsrK214ICkKCQl7CgkJCWZvciAoIG1uPTA7bW48PTI7KyttbiApCgkJCXsKCQkJCWlmICggaT09TiApCgkJCQl7CgkJCQkJQVtpXVtteF1bbW5dID0gMTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCUFbaV1bbXhdW21uXSA9IEFbaSsxXVtteCsxXVttYXgoMCxtbi0xKV0rQVtpKzFdW21heCgwLG14LTEpXVttbisxXTsKCQkJCUFbaV1bbXhdW21uXSAtPSBBW2ldW214XVttbl0gPj0gbW9kID8gbW9kIDogMDsKCQkJfQoJCX0KCX0KfQoKc3RyaW5nIHM7CgppbmxpbmUgaWkgcXVlcnkoKQp7CglpbnQgaWR4LGksbXgsbW47CgoJbXggPSAwLCBtbiA9IDA7CglpZHggPSAwOwoJZm9yICggaT0wO2k8TjsrK2kgKQoJewoJCWlmICggc1tpXT09J0wnICkKCQl7CgkJCW14ID0gbWF4KDAsbXgtMSk7CgkJCW1uKys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZHggKz0gQVtpKzFdW21heCgwLG14LTEpXVttbisxXTsKCQlpZHggLT0gaWR4ID49IG1vZCA/IG1vZCA6IDA7CgkJCgkJbXggKz0gMTsKCQltbiA9IG1heCgwLG1uLTEpOwoJfQoKCWlkeCArPSAxOwoJaWR4IC09IGlkeCA+PSBtb2QgPyBtb2QgOiAwOwoKCXJldHVybiBpZHg7Cn0KCmludCBtYWluKCkKewoJCglOID0gaW5wKCk7CW1vZCA9IGlucCgpOwoJCglzID0gaXAoKTsKCQoJc29sdmUoKTsKCXdyaXRlKHF1ZXJ5KCkpOwoJCglyZXR1cm4gMDsKfQ==