【题解】1-2-K Game

题目大意

  现有\(n\)个东西,每次可以取\(1\)个,\(2\)个或\(k\)个。Alice和Bob轮流取,且Alice先取。问谁是最后一个取的。(\(0 \leq n \leq 10^9\)\(3 \leq k \leq 10^9\))

题解

  首先,我们先考虑只有\(1\)\(2\)的情况。容易想到\(3|k\)时,先手必败。
  此时,我们再加上\(k\)。随手推几下就会发现,当\(k \bmod 3 \not = 0\)时,\(k\)也就相当于是\(1\)\(2\),这样的话直接判断即可。
  而当\(3|k\)时,实际上,当Alice取\(1\)\(k\)时,Bob也能取\(k\)\(1\),此时共取了\(k + 1\)个,而当\(Alice\)\(1\)\(2\)时,\(Bob\)也可以取\(2\)\(1\),总共取了\(3\)个,对答案不影响。
  所以,当\(3|k\)时,我们可以让\(n\)\(k + 1\)取余,然后最多只能取一次\(k\),判断是否能取\(k\),或再进行无\(k\)判断即可。

#include <iostream>

using namespace std;

int T;
int n, k;

int main() 
{
    cin >> T;
    while(T--) 
    {
        cin >> n >> k;
        if(k % 3) 
        {
            if(n % 3) cout << "Alice\n";
            else cout << "Bob\n";
            continue;
        }
        n %= k + 1;
        if(n == k) cout << "Alice\n";
        else if(n % 3) cout << "Alice\n";
        else cout << "Bob\n";
    }
    return 0;
}

转载于:https://www.cnblogs.com/kcn999/p/11326858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值