Bài viết: 28 



Link bài:
Thuật toán:
Code:
Thuật toán:
- Trường hợp k = 1, người chiến thắng sẽ được xác định đơn giản:
- Nếu n lẻ, Alice sẽ là người thắng. Bằng không, Bob sẽ thắng.
- Trường hợp k > n, Alice sẽ thắng sau một lượt chơi.
- Trường hợp n = k, Alice sẽ thắng sau một lượt chơi. Tổng quát với trường hợp (2x+1) *k Alice sẽ thắng.
- Trường hợp n = 2k, Alice chỉ cần chọn k-1 và Bob có chọn thế nào thì Alice vẫn sẽ thắng.
- Trường hợp n = k+1, Alice có chọn thế nào thì Bob cũng sẽ là người thắng cuộc. Tổng quát với trường hợp (2x+1) *k +1, (x là số tự nhiên). Bob sẽ là người thắng cuộc.
- Duy chỉ cần n = k+2 trở lên, nếu Alice chọn n-k-1, Alice sẽ có cửa thắng. Tổng quát với trường hợp (2x+1) *k+y (Với y < k) Alice sẽ là người thắng cuộc.
- Trường hợp n = 2*k+1, Alice sẽ lập tức chọn k ở lượt đầu tiên, và sau đó Bob có chọn thế nào thì Alice cũng sẽ thắng cuộc. Tổng quát với trường hợp 2x+2k+1. Alice sẽ là người thắng cuộc.
- Tương tự như trên, với trường hợp 2x+2k+y (với y < k). Bob sẽ là người thắng cuộc.
Code:
Mã:
#include <bits/stdc++.h>
using namespace std;
int n, k;
int main(){
//freopen("albo.inp", "r", stdin);
//freopen("albo.out", "w", stdout);
cin >> n >> k;
if (k == 1){
if ( n % 2 == 0) cout << "Bob will win"; else cout << "Alice will win";
}else if (n%k == 0) cout << "Alice will win";
else if (n <= k) cout << "Alice will win";
else if (n%k == 1){
if ((n-1)% (2*k) != 0) cout << "Bob will win";
else cout << "Alice will win";
}else if (n%k > 1){
if ((n-(n%k))% (2*k) != 0) cout << "Alice will win";
else cout << "Bob will win";
}
return 0;
}