NIM博弈-Nim plus

Long Long and Mao Mao both have AKed the new div.1 round in Codeforces tonight, but it’s too early to sleep now. So they decide to play one special Nim game.

In this special nim game, there are n paper balls on the table at the beginning of the game. But unlike some simple nim game, they each have m numbers in a set. They could only take away the number of paper balls which occur in their set. In the end, those who cannot take away any paper ball lose this game.

Long Long takes the first, and he would like to know whether he can win this game, please help him.

Input
The first line contains two positive integers n (1≤n≤5 000) and m (1≤m≤100) — the number of the paper balls and their sets’ size.

The second line contains m positive integers a1,a2,⋯,am (1≤ai<ai+1≤500) — the numbers in Long Long’s set.

The third line contains m positive integers b1,b2,⋯,bm (1≤bi<bi+1≤500) — the numbers in Mao Mao’s set.

Output
Print Long Long nb! if Long Long can secure the victory, and Mao Mao nb! otherwise.

Examples
Input
5 1
6
7
Output
Mao Mao nb!
Input
20 3
3 7 10
2 6 7
Output
Long Long nb!
Note
In the first sample, Long Long can only take 6 paper balls, but there are only 5 remains on the table, so he loses this game.

In the second sample, Long Long could take 10 paper balls first, and 10 remains on the table:

If Mao Mao takes 2 paper balls, Long Long could take another 7 paper balls. Then there is only one paper ball that remains on the table, the winner is Long Long.
If Mao Mao takes 6 or 7 paper balls, Long Long can also take 3 paper balls to make one paper ball or empty left on the table. In this case, the winner is Long Long.

大意:
给两个数字n和m,n代表个数,m代表每个人可以有多少种选择
接下来两行,第一行代表先手的那个人的m个选择
第二行代表后手的m个选择
两个人只能从自己的m个选择里取数,如果没有可以取的,判输

#include<bits/stdc++.h>
using namespace std;
int a[6000];
int b[6000];
int sg_a[6000];
int sg_b[6000];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>a[i];
    for(int j=1;j<=m;j++) cin>>b[j];
    sort(a+1,a+m+1);
    sort(b+1,b+1+m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m&&a[j]<=i;j++)
            if(sg_b[i-a[j]]==0) sg_a[i]=1;
        for(int j=1;j<=m&&b[j]<=i;j++)
            if(sg_a[i-b[j]]==0) sg_b[i]=1;
    }
    if(!sg_a[n]) cout<<"Mao Mao nb!"<<endl;
    else cout<<"Long Long nb!"<<endl;
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JdiLfc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值