Codeforces 851E-Arpa and a game with Mojtaba

来源:互联网 发布:java 抓取网页内容 编辑:程序博客网 时间:2024/05/17 22:22

E. Arpa and a game with Mojtaba
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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 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

博弈论的题,看了题解说是对每个质数分开暴力求sg函数,然后把sg异或起来就可以了,最后还是基本抄了别人的代码,自己加了点注释

代码:

#include <bits/stdc++.h>using namespace std;#define mem(s,v) memset(s,v,sizeof(s))typedef long long ll;const double PI = acos(-1);const ll mod = 1000000007;const int inf = 0x3f3f3f3f;const ll INF =  0x3f3f3f3f3f3f3f3f;map<int,int> mp,sg;int dfs(int mask) //求出该状态的SG函数  为其所有后继状态的mex{    if(!mask)return 0;    if(sg.find(mask)!=sg.end())return sg[mask];   //记忆化    int mx=0;    for(int i=1;i<30;i++)        if(mask>>i&1)mx=i;    int vis=0;    for(int i=1;i<=mx;i++)    {        int tmask=((mask>>(i+1))<<1)|(mask&((1<<i)-1));             //枚举进行除以p^i的操作  所有比i大的都减少i          //(mask>>(i+1))<<1)表示高于i的都减少i (mask&((1<<i)-1))表示低i位全部不变         vis|=(1<<dfs(tmask));    }    int res=0;    for(int i=30;i>=0;i--)        if(~vis>>i&1)res=i;    return sg[mask]=res;}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        int a;        scanf("%d",&a);        for(int i=2;i*i<=a;i++)            if(a%i==0)            {                int cnt=0;                while(a%i==0)                    a/=i,cnt++;                mp[i]|=(1<<cnt);            }        if(a>1)mp[a]|=(1<<1);    }    int sum=0;    for(auto itr=mp.begin();itr!=mp.end();itr++)        sum^=dfs(itr->second);    printf("%s\n",(sum==0 ? "Arpa" : "Mojtaba"));    return 0;}
阅读全文
0 0