题目:
题目大意:输入n,k。两个人轮流选一个数x(1<=x<=max(1,n-k))减去n,若到一个人的回合n=0那么那个人失败。Kilani先手。
通过手动模拟几个实例,很容易发现先手基本都是胜利的。
如 n取10,k取2;
先手的取值范围是[1,8],这时x取8一定能获胜,因为当x=8时n=2,后手只能取1,一轮后,先手获胜。
n取10,k取3;
先手的取值范围是[1,7],这时x取6一定能获胜,因为当x=6时n=4,后手同样只能取1,此时n又是偶数,几轮下来先手获胜。
根据实例可以归纳出,只要先手取x使n为偶数并且n-k<=1,就必定获胜。
加以数学证明:
设x为先手必胜,所选取的数,所以
n-x-k<=1 ①
(n-x)%2=0
①整理得 x>=n-k-1;
x∈[1,max(1,n-k)];
当n-k>1时,x∈[1,n-k];
取最大x=n-k;
所以 x<=n-k-1 恒成立;
x-1<=n-k-1 恒成立;
当n,k是偶数时(n-x)%2=0 成立
当n,k是奇数时(n-x)%2=0 成立
当n,k一奇一偶时(n-x-1)%2=0 成立
所以 当 n-k>1时 先手必胜
当n-k<=1时,x=1;
此时若n为偶则后手胜利,反之先手胜利;
AC代码:
#include<iostream> using namespace std; int main() { int t, n, k; int flag; cin >> t; while (t--) { flag = 1; cin >> n >> k; if ((n - k == 1 )||(n-k==0)) if(n % 2 == 0)flag = 0; if (flag)cout << "Kilani\n"; else cout << "Ayoub\n"; } }