EOJ 3354 领外卖

题目简介


林吉吉(LJJ)和金大哥(JDG)为了谁去领外卖吵得不可开交,为了确定谁去领外卖,李蓓蓓学姐设计了一个简单的游戏:给定一堆 n 个石子,每个人轮流从石子堆取走若干个石子,要求每次取走的石子数为正完全平方数(即此数为某个正整数的平方),拿走最后一颗石子的人获胜,林吉吉先手。

请问若双方都以最佳方式进行选择,谁将去领外卖?

说明


简单的博弈论题。写了前几项,以为找到了规律,不证明直接推广,在这里就容易出错。这是因为这里输赢状态取决于前i-j^2(j <= sqrt(i))项的状态。
顺带一提,位运算真好用。

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

int main()
{
    int n, t, i, j;
    scanf("%d", &t);
    bool flag[100001] = {0}, and;
    flag[1] = 1;
    for (i = 2; i <= 100000; ++i){
        and = 1;
        for (j = 1; j <= sqrt(i); ++j)
            and &= flag[i - j * j];
        flag[i] = !and;
    }
    while (t--){
        scanf("%d", &n);
        if (flag[n]) printf("JDG will get takeaways!\n");
        else printf("LJJ will get takeaways!\n");
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值