Matrix67和Shadow正在做一个小游戏。
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。
高高兴兴发题解。
HHD大神主动放弃此题,哈哈。
-----------------------------------------------------------我是神奇的分界线------------------------------------------------------------------------------
分析一下,首先假设我们取了第一堆,那么我们来考虑第二堆的分法:
必胜1,4,5,6,9,10,11,14,15,16
必败2,3,7,8,12,13,17,18
然后就发现规律:mod 5后于0,1,4则必胜,否则必败(先手)
那么,只要两堆里,有一堆满足我必胜,就先手必胜。
然后就发现规律:mod 5后于0,1,4则必胜,否则必败(先手)
那么,只要两堆里,有一堆满足我必胜,就先手必胜。
var s1,s2:ansistring; l1,l2,d1,d2,i,p:longint; function ok(k:longint):boolean; var p:longint; begin p:=k mod 5; if (p=0) or (p=1) or (p=4) then exit(true); exit(false); end; begin for i:=1 to 10 do begin readln(s2); p:=pos(' ',s2); s1:=copy(s2,1,p-1); delete(s2,1,p); l1:=length(s1);l2:=length(s2); if (l1=1) then d1:=ord(s1[1])-48 elsed1:=10*(ord(s1[l1-1])-48)+ord(s1[l1])-48; if (l2=1) then d2:=ord(s2[1])-48 elsed2:=10*(ord(s2[l2-1])-48)+ord(s2[l2])-48; if (ok(d1) or ok(d2)) thenwriteln('Matrix67') else writeln('Shadow'); end; end.