CF1194D 1-2-K Game
一道簡單的博弈論題
首先讓我們考慮沒有k的情況:
1. (n mod 3 =0)
因為n可以被分解成若干個3相加
而每個3可以被分解為1+2或2+1
所以無論A出什么B都有方法應對
B勝
2. (n mod 3 =1)
A可以先選擇余數1
這樣問題又回到了第一種情況
AB角色互換
A勝
3. (n mod 3 =2)
與2同理,A先選2即勝
而現在多出來的這個k也可以看成是3的某個自然數倍數加上一個小於3的數
即\(k\equiv x\left( mod3\right)\)
我們再來對x分類討論:
1. (x=0)
此時的k就好像快速地切除1+2或2+1的回合
但對手總不會站着不動吧?
我們知道B總是有方法使每一回合內(A+B)%3都等於1的
列舉一下(k用3代替):
A:1 B:3
A:2 B:2
A:3 B:1
是不是每回合在mod3意義下都是相同的?
那么若干個回合后如果無法實現上述方法了
即n%=k+1
如果n=k A獲勝
否則情況又變回了無k的情況
%3判斷即可
2. (x=1)
此時k就好像有着能省略若干個回合功能的1
k就可有可無了
又回到了無k的情況
3. (x=2)
與2同理
知道了這些,代碼就很好寫了:
int n,k,t;
signed main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
if(k%3){
if(n%3) puts("Alice");
else puts("Bob");
}
else{
n%=k+1;
if(n==k||n%3) puts("Alice");
else puts("Bob");
}
}
}