1. 程式人生 > >HDU 1846 Brave Game (博弈論)

HDU 1846 Brave Game (博弈論)

問題描述

Brave Game

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15478    Accepted Submission(s): 10577  

Problem Description

十年前讀大學的時候,中國每年都要從國外引進一些電影大片,其中有一部電影就叫《勇敢者的遊戲》(英文名稱:Zathura),一直到現在,我依然對於電影中的部分電腦特技印象深刻。今天,大家選擇上機考試,就是一種勇敢(brave)的選擇;這個短學期,我們講的是博弈(

game)專題;所以,大家現在玩的也是勇敢者的遊戲,這也是我命名這個題目的原因。當然,除了勇敢,我還希望看到誠信,無論考試成績如何,希望看到的都是一個真實的結果,我也相信大家一定能做到的~各位勇敢者要玩的第一個遊戲是什麼呢?很簡單,它是這樣定義的:1  本遊戲是一個二人遊戲; 2  有一堆石子一共有n個;3  兩人輪流進行; 4  每走一步可以取走1…m個石子;5  最先取光石子的一方為勝;如果遊戲的雙方使用的都是最優策略,請輸出哪個人能贏。

Input

輸入資料首先包含一個正整數C(C<=100),表示有C組測試資料。每組測試資料佔一行,包含兩個整數nm

1<=n,m<=1000),nm的含義見題目描述。

Output

如果先走的人能贏,請輸出“first”,否則請輸出“second”,每個例項的輸出佔一行。

Sample Input

2

23 2

4 3

Sample Output

first

second

------------------------------------------------------------

思路

博弈論。記F(n)為以n顆石子開局的勝者id (F(n) = 0/1,先手: 0/後手: 1). 簡單推導一下:

後手勝局

先手勝局

F(0) = 1

F(1) = F(2) = … = F(m) = 0

F(m+1) = 1

F(m+2) = F(m+3) = … = F(2m+1) = 0

F(2m+2) = 1

F(2m+3) = F(2m+4) = … = F(3m+2) = 0

……

……

由此可見,後手勝局的充要條件是 n % (m+1) = 0

------------------------------------------------------------

程式碼

#define _CRT_SECURE_NO_WARNINGS

#include<cstdio>

int main()
{
	int t, n, m;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d", &n, &m);
		printf(n % (m + 1) == 0 ? "second\n" : "first\n");
	}
	return 0;
}