巴什博弈:两人轮流从一堆里取东西共n,每人每次只能取1~m个,最后一次取光者获胜。
n=(m+1)*a+b;
要想胜利,若b!=0,先手胜利。先手拿b个,使剩余(m+1)的倍数,这样每次对手拿k个,你都可以拿m+1-k个,使之一直为(m+1)的倍数,那最后一次肯定是先手拿。b=0时后手就掌握主动权了。
#include <iostream>
using namespace std;
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
if(n%(m+1))
cout<<"first"<<endl;
else
cout<<"second"<<endl;
}
return 0;
}
题目
思路:思考后也是巴什博弈。如果你是先手,那么请考虑你的必胜点。由于规定只能去2的幂次,那么只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1,要么取剩下1,给你胜利 2,要么对手取了一点点儿,轮到你时,你又可以构造一个3的倍数了。 所以无论哪种情况,当你留给对手为3n的时候,你是必胜的。题目说你就是Kiki,那么当牌数为3的倍数时,Kiki就输了。因为一出来,上帝就留给了Kiki一个3的倍数。没办法,但是如果一开始上帝留给Kiki的不是3的倍数,那么Kiki肯定能够用先手的优势构造出3的倍数,那么Kiki就必胜。所以代码是异常的简单啊。
#include <iostream>
using namespace std;
int main()
{int n;
while(cin>>n)
{
if(n%3!=0)
cout<<"Kiki"<<endl;
else
cout<<"Cici"<<endl;
}
return 0;
}
对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?
(n-1)%(m+1)==0则后手胜利,先手会重新决定策略,所以不是简单的相反行的