Mojtaba and Arpa are playing a game. They have a list of n numbers in the game.

In a player's turn, he chooses a number pk (where p is a prime number and k is a positive integer) such that pk divides at least one number in the list. For each number in the list divisible by pk, call it x, the player will delete x and add <image> to the list. The player who can not make a valid choice of p and k loses.

Mojtaba starts the game and the players alternatively make moves. Determine which one of players will be the winner if both players play optimally.

Input

The first line contains a single integer n (1 ≤ n ≤ 100) — the number of elements in the list.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the elements of the list.

Output

If Mojtaba wins, print "Mojtaba", otherwise print "Arpa" (without quotes).

You can print each letter in any case (upper or lower).

Examples

Input

4
1 1 1 1


Output

Arpa


Input

4
1 1 17 17


Output

Mojtaba


Input

4
1 1 17 289


Output

Arpa


Input

5
1 2 3 4 5


Output

Arpa

Note

In the first sample test, Mojtaba can't move.

In the second sample test, Mojtaba chooses p = 17 and k = 1, then the list changes to [1, 1, 1, 1].

In the third sample test, if Mojtaba chooses p = 17 and k = 1, then Arpa chooses p = 17 and k = 1 and wins, if Mojtaba chooses p = 17 and k = 2, then Arpa chooses p = 17 and k = 1 and wins.
#include <bits/stdc++.h>
using namespace std;
const int N = 29;
unordered_map<vector<bool>, int> G;
unordered_map<int, vector<bool>> M;
vector<int> linear(const int N) {
  vector<bool> isp(N, true);
  vector<int> p;
  for (int i = 2; i < N; i++) {
    if (isp[i]) p.push_back(i);
    for (int j = 0; j < p.size() && (long long)p[j] * i < N; j++) {
      isp[p[j] * i] = false;
      if (i % p[j] == 0) break;
    }
  }
  return p;
}
int sol(vector<bool> v) {
  bool has = false;
  for (int i = 1; i <= N; i++) has |= v[i];
  if (!has) return 0;
  if (G.find(v) == G.end()) {
    unordered_set<int> S;
    for (int i = N; i >= 1; i--)
      if (v[i]) {
        for (int j = i; j >= 1; j--) {
          vector<bool> w(N + 1, false);
          for (int k = j + 1; k <= i; k++)
            if (v[k]) w[k - j] = true;
          for (int k = 1; k < j; k++)
            if (v[k]) w[k] = true;
          S.insert(sol(w));
        }
        break;
      }
    G[v] = 1e5;
    for (int i = 0; i < 1e5; i++)
      if (S.find(i) == S.end()) {
        G[v] = i;
        break;
      }
  }
  return G[v];
}
void upd(int p, int cnt) {
  if (M.find(p) == M.end()) {
    M[p] = vector<bool>(N + 1, false);
  }
  M[p][cnt] = true;
}
int main() {
  vector<int> pri = linear(32000);
  int n, ans = 0;
  for (scanf("%d", &n); n > 0; n--) {
    int x;
    scanf("%d", &x);
    for (int p : pri) {
      if (x <= 1) break;
      if (x % p == 0) {
        int cnt = 0;
        while (x % p == 0) cnt++, x /= p;
        upd(p, cnt);
      }
    }
    if (x > 1) upd(x, 1);
  }
  for (auto &t : M) {
    auto v = t.second;
    ans ^= sol(v);
  }
  printf("%s\n", ans ? "Mojtaba" : "Arpa");
}
