题目简介
林吉吉(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;
}