问题 B: AMMO
时间限制: 1Sec 内存限制: 128 MB
题目描述
Richard和Dick是两名绝地潜兵,他们俩要领取弹药,他们决定玩一个取弹药的游戏:两人轮流取弹药,每次最少取一份,最多取m份,弹药总份数为n,约定先取光弹药的人获胜。
输入
输入第一行为T,表示他们进行了T个回合,即有T组输入数据(1<=T<=100)
每组第一行为一个整数,代表游戏顺序,1表示Richard先取,0表示Dick先取
第二行为两个整数,m和n,1≤m≤n≤1000
输出
每组数据输出一行,为获胜者的名字
样例输入
3
1
15 100
0
1 5
1
1 3
样例输出
Richard
Dick
Richard
以前我总是不知道怎么解决这一类问题,比赛的时候看见就直接丢掉了。后来才知道这原来是一道奥数题...
来自http://www.1010jiajiao.com/xxsx/shiti_id_cee7a23fd3dfd29dda9176821968438d
题目是这样的
有47根火柴,两人轮流来取,每次最多取5根,最少取1根,谁最后把火柴取完谁就算胜利了,现在由甲先取,乙应如何取胜?
以下是解答
(后来我还在百度上看见一个中学课件讲这个的...丢人啊)
简单来说,对于这道题就是判断n%(m+1)!=0是否成立,如果成立的话就说明先取子弹的人最终获胜。
以第一个样例展示:
100/(1+15)=6...4,那么第一个取的人只需要取4个,接下来第二个人取k个,第一个人就取6-k个,取到最后子弹的一定是最开始取的人。
如果n%(m+1)==0那么情况就正好反过来了。
代码如下:
#include <iostream> using namespace std; int main() { int t; cin>>t; int m,n; int start; for(int i=0;i<t;i++) { cin>>start>>m>>n; if(n%(m+1)) { if(start) { cout<<"Richard"<<endl; } else { cout<<"Dick"<<endl; } } else { if(start) { cout<<"Dick"<<endl; } else { cout<<"Richard"<<endl; } } } return 0; }