CF1194D 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 mod 3 ot = 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
";
            else cout << "Bob
";
            continue;
        }
        n %= k + 1;
        if(n == k) cout << "Alice
";
        else if(n % 3) cout << "Alice
";
        else cout << "Bob
";
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kcn999/p/11326858.html