【刷题小记23】取石子

描述
一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子。游戏的规则是这样的。设有一堆石子,数量为N(1<=N<=1000000),两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利。我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么?

输入
第一行是一个正整数n表示有n组测试数据

输入有不到1000组数据,每组数据一行,有两个数N和M,之间用空格分隔。

输出

对于每组数据,输出一行。如果先取的TT可以赢得游戏,则输出“Win”,否则输出“Lose”(引号不用输出)

分析:这题就是著名的巴什博奕(Bash Gaem)

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.

若(m+1) | n,则先手必败,否则先手必胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发

现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿

走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜.总之,要保持给对手留下(m+1)的倍数,就能最后获胜.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int Cases;
    int N,M;
    scanf("%d",&Cases);
    while(Cases--)
    {
		scanf("%d %d",&N,&M);
        if(N%(M+1)==0)
			printf("Lose\n");
        else
			printf("Win\n");
	}
	return 0;
}
时间: 2024-10-26 11:48:04

【刷题小记23】取石子的相关文章

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head

NYOJ 23.取石子(一)

取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的规则是这样的.设有一堆石子,数量为N(1<=N<=1000000),两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利.我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么? 输入 第一行是一个正整数n表示有

NYOJ 23 取石子(一)

取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的规则是这样的.设有一堆石子,数量为N(1<=N<=1000000),两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利.我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么? 输入 第一行是一个正整数n表示有

【刷题小记】用数组模拟约瑟夫环

问题描述: n 个人围城一圈,第1个人从1开始报数,报数到m的人出列,然后从下一个人开始又从1开始报数,重复游戏n-1次,每次淘汰1人,最后剩下的人就是胜利者. 实心方法: 这是约瑟夫环问题,可以用链表实现,我在这里用数组实现,具体分析如下: 用到变量:以n=8,m=4为例说明 r:控制循环次数 i:用于记录每次出列的人位置,从1变化到8再到1 j:用于控制报数,从1变化到4,在到1.... 图1 图2 图3 图4 图5 图6 图7 图8 注意的地方: 1)模拟报数过程,从1开始报数,达到4后,

LintCode刷题小记491

题目: 判断一个正整数是不是回文数. 回文数的定义是,将这个数反转之后,得到的数仍然是同一个数. 样例: 11, 121, 1, 12321 这些是回文数. 23, 32, 1232 这些不是回文数. 分析: 回文数就是反转后和自身一样,可利用java中StringBuffer中reverse()这一函数进行操作. 下面给出代码: 1 public class Solution { 2 /** 3 * @param num a positive number 4 * @return true i

Atcoder刷题小记

1. 2019.4.27 agc016d 一道很坑的题. 首先判无解,求出异或值后排个序就可以. 然后直接让\(a_i\rightarrow b_i\)并查集维护,注意离散化和判重,答案加上联通块个数即可,注意细节即可. 原文地址:https://www.cnblogs.com/Pro-king/p/10778299.html

【刷题小记28】大数阶乘

描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 分析:很明阶乘的数比较大,用int会溢出,所以采用int数组的方法,用数组的元素来保存每一位,根据乘法的相乘规则,用数组元素的每一位去乘迭代 #include <iostream> #include <cstring> #include <cstdlib> using na

【刷题小记67】三角形面积

描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入 每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示三个点的横纵坐标.(坐标值都在0到10000之间) 输入0 0 0 0 0 0表示输入结束 测试数据不超过10000组 输出 输出这三个点所代表的三角形的面积,结果精确到小数点后1位(即使是整数也要输出一位小数位) 分析:用向量法简单,向量的叉乘在定义上有:两个向量进行叉乘得到的是一个向量,方向垂直于这两个向量构成的平面,大小等于这两个向量组成

【刷题小记66】分拆数

[转载请注明出处]http://blog.csdn.net/mingyong_blog/article/details/39252363 描述 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y. 输入 第一行输入一个整数n,代表有n组测试数据. 接下来n行每行输入一个正整数k 输出 按顺序输出对应每行的k找到所有满足条件1/k=1/x+1/y的组合 思路分析 关键是怎么处理1/k=1/x+1/y,由于对除法不好处理,这个式子中有3个除法,所以转化成乘法的形式处理,转成成