处理何种问题:有n个石子,两个人轮流取石子,规定至少取1个,最多取k个,最后取光者获胜。
性能:时间复杂度为O(1)
原理:n%(k+1)==0,后手必胜(先手无论怎么取,后手只需要补全至k+1个即可);n%(k+1)!=0,先手必胜(先手只需要第一次将n%(k+1)的余数取尽,先手就转成“后手”了)
实现步骤:略
备注:遇到此类问题可向巴什博弈方向转化,例如:有n个石子,两个人轮流取石子,规定至少取1个,最多取k个,最后取光者输掉游戏(区别于上面赢)。因为是取掉最后一个必输,也就是说,最后一局取走的石子数肯定是1,所以问题就变为有(n-1)个石子的巴什博弈了。
输入样例解释:
55 6 // 55个石子,每次最多取6个
545 8
输出样例解释:
First Win //先手获胜
First Win
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main() { int n,k; while(~scanf("%d%d",&n,&k)) { if(n%(k+1)==0) printf("Second Win "); else printf("First Win "); } return 0; }