#include <bits/stdc++.h>
clock_t t = clock();
namespace my_std {
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <typename T>
inline T rnd(T l, T r) {
  return uniform_int_distribution<T>(l, r)(rng);
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmin(T &x, T y) {
  return x > y ? x = y, 1 : 0;
}
template <typename T>
inline void read(T &t) {
  t = 0;
  char f = 0, ch = getchar();
  double d = 0.1;
  while (ch > '9' || ch < '0') f |= (ch == '-'), ch = getchar();
  while (ch <= '9' && ch >= '0') t = t * 10 + ch - 48, ch = getchar();
  if (ch == '.') {
    ch = getchar();
    while (ch <= '9' && ch >= '0') t += d * (ch ^ 48), d *= 0.1, ch = getchar();
  }
  t = (f ? -t : t);
}
template <typename T, typename... Args>
inline void read(T &t, Args &...args) {
  read(t);
  read(args...);
}
char __sr[1 << 21], __z[20];
int __C = -1, __zz = 0;
inline void Ot() { fwrite(__sr, 1, __C + 1, stdout), __C = -1; }
inline void print(register int x) {
  if (__C > 1 << 20) Ot();
  if (x < 0) __sr[++__C] = '-', x = -x;
  while (__z[++__zz] = x % 10 + 48, x /= 10)
    ;
  while (__sr[++__C] = __z[__zz], --__zz)
    ;
  __sr[++__C] = '\n';
}
void file() {}
inline void chktime() {}
long long ksm(long long x, int y) {
  long long ret = 1;
  for (; y; y >>= 1, x = x * x)
    if (y & 1) ret = ret * x;
  return ret;
}
}  // namespace my_std
using namespace my_std;
int n, K;
vector<int> bl[30100];
int ok[30100];
struct hh {
  int t, nxt;
} edge[30100];
int head[30100], ecnt;
void make_edge(int f, int t) {
  edge[++ecnt] = (hh){t, head[f]};
  head[f] = ecnt;
}
int vis[30100];
int pth[30100], c;
void dfs(int x) {
  for (int &i = head[x], t; (t = i); i = edge[i].nxt)
    if (!vis[i]) vis[i] = 1, dfs(edge[i].t), pth[++c] = edge[t].t;
}
int ask(int x) {
  printf("? %d\n", x);
  fflush(stdout);
  char c;
  cin >> c;
  return c == 'Y';
}
void add(int id, int flg) {
  for (int i = (0); i <= (K - 1); i++) ok[bl[id][i]] &= !(flg & ask(bl[id][i]));
}
void add2(int id, int flg) {
  int p = -1;
  for (int i = (K - 1); i >= (0); i--)
    if (ok[bl[id][i]]) p = i;
  if (p == -1) {
    for (int i = (0); i <= (K - 1); i++) ask(bl[id][i]);
    return;
  }
  if (p == 0) {
    for (int i = (0); i <= (K - 1); i++)
      if (ok[bl[id][i]])
        ok[bl[id][i]] &= !(flg & ask(bl[id][i]));
      else
        ask(bl[id][p]);
  } else {
    ok[bl[id][p]] &= !(flg & ask(bl[id][p]));
    for (int i = (1); i <= (p); i++) ask(bl[id][p]);
    for (int i = (p + 1); i <= (K - 1); i++)
      if (ok[bl[id][i]])
        ok[bl[id][i]] &= !(flg & ask(bl[id][i]));
      else
        ask(bl[id][p]);
  }
}
void work(int t) {
  int n = ::n / K;
  for (int i = (1); i <= (n); i++)
    for (int j = (i + 1); j <= (n); j++) make_edge(i, j);
  for (int i = (1); i <= (n / 2); i++)
    for (int j = (1); j <= (n - 2 * i + 1); j++) make_edge(n - i + 1, i);
  dfs(1);
  pth[++c] = 1;
  reverse(pth + 1, pth + c + 1);
  --c;
  add(1, !t);
  for (int i = (2); i <= (c); i++)
    t ? add2(pth[i], pth[i] > pth[i - 1]) : add(pth[i], pth[i] > pth[i - 1]);
  for (int i = (1); i <= (ecnt); i++) vis[i] = 0;
  c = ecnt = 0;
  for (int i = (1); i <= (n); i++) head[i] = 0;
}
int main() {
  read(n, K);
  for (int i = (1); i <= (n); i++) ok[i] = 1;
  for (int i = (1); i <= (n / K); i++)
    for (int j = ((i - 1) * K + 1); j <= (i * K); j++) bl[i].push_back(j);
  work(0);
  printf("R\n");
  fflush(stdout);
  for (int i = (1); i <= (n / K); i++) reverse(bl[i].begin(), bl[i].end());
  if (K != n) work(1);
  int ans = 0;
  for (int i = (1); i <= (n); i++) ans += ok[i];
  printf("! %d\n", ans);
  fflush(stdout);
  return 0;
}
