题意:
1、 总共n张牌;
2、 双方轮流抓牌;
3、 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
思路:很久以前做过这题,可以拿sg函数做,也可以用pn做,现在才知道也是个巴什博弈
摘自:点击打开链接
巴什博弈(定理献上):
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.
n = (m+1)r+s , (r为任意自然数,s≤m), 即n%(m+1) != 0, 则先取者肯定获胜。
巴什博弈还是很好理解滴,以你是先手的角度考虑。你想把对手给弄垮,那么每一局,你都必须构建一个局势,这个局势就是每次都留给对手m+1的倍数个物品(为什么留给m+1倍就一定能赢,你稍微动动脑子就出来了)。所以不只是取物品中的博弈可以用到巴什定理,还可以是报数之类的,看谁先报到100.并且每次报的数必须是1~10(包括1跟10),那么你每次都应该留给对手剩下的报数个数为11的倍数。
如果你是先手,那么请考虑你的必胜点。由于规定只能去2的幂次,那么只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1,要么取剩下1,给你胜利 2,要么对手取了一点点儿,轮到你时,你就又可以构造一个3的倍数了嘛。 所以无论哪种情况,当你留给对手为3N的时候,你是必胜的。好吧,题目说你就是Kiki,那么当牌数为3的倍数时,Kiki就输了。因为一出来,上帝就留给了Kiki一个3的倍数。没办法,但是如果一开始上帝留给Kiki的不是3的倍数,那么Kiki肯定能够用先手的优势构造出3的倍数,那么Kiki就必胜。所以代码是异常的简单啊。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
while (sc.hasNext()) {
n = sc.nextInt();
System.out.println(n%3==0 ? "Cici" : "Kiki");
}
}
}
sg和pn做法在这 点击打开链接