Nim plus (SG函数)

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.

基本上是个裸的SG()函数,只不过两人能拿的个数不相同,注意区分一下

#include <bits/stdc++.h>
using namespace std;
int f[2][105], n, m;
int ans[2][5005];
int SG(int x, int num) {
    if (ans[num][x] != -1) return ans[num][x];
    int vis[5004], i;
    memset(vis, 0, sizeof(vis));
    for (i = 0; i < m; i++) {
        if (x >= f[num][i]) vis[SG(x - f[num][i], 1 - num)] = 1;
    }
    for (i = 0;; i++) {
        if (vis[i] == 0) return ans[num][x] = i;
    }
}
int main() {
    ios::sync_with_stdio(false);
    memset(ans, -1, sizeof(ans));
    cin >> n >> m;
    for (int i = 0; i < m; i++) cin >> f[0][i];
    for (int i = 0; i < m; i++) cin >> f[1][i];
    if (SG(n, 0))
        puts("Long Long nb!");
    else
        puts("Mao Mao nb!");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值