Algorithm 破塔者-带除数的nim游戏变体

Algorithm 破塔者-带除数的nim游戏变体,algorithm,math,game-theory,nim-game,Algorithm,Math,Game Theory,Nim Game,我遇到了一个名为“破塔者”的游戏,它似乎是游戏的一个变体 有两个玩家,玩家1和玩家2 最初有n塔,其中每个塔的高度m,都是n和m正整数 玩家1开始,然后轮流移动 在每个回合中,玩家可以选择一个高度为x>1的塔,并将其高度降低为正整数y,其中1为一般情况 这确实可以像解决问题一样解决,但使用不同的灵活定义 在最初的游戏中,塔的灵巧度被简单地定义为它的高度 在这种变化中,高度h(T)=x=p的塔的敏捷度T₁ˢimk_…pₖˢᵏ,带有pᵢ素数,是 n(T)=s₁ + … + sₖ ntowersL

我遇到了一个名为“破塔者”的游戏,它似乎是游戏的一个变体

  • 有两个玩家,玩家1和玩家2
  • 最初有
    n
    塔,其中每个塔的高度
    m
    ,都是
    n
    m
    正整数
  • 玩家1开始,然后轮流移动
  • 在每个回合中,玩家可以选择一个高度为
    x>1
    的塔,并将其高度降低为正整数
    y
    ,其中
    1为一般情况
    这确实可以像解决问题一样解决,但使用不同的灵活定义

    在最初的游戏中,塔的灵巧度被简单地定义为它的高度

    在这种变化中,高度
    h(T)=x=p的塔的敏捷度
    T
    ₁ˢimk_…pₖˢᵏ,带有
    pᵢ素数,是

    n(T)=s₁ + … + sₖ
    
    n
    towers
    L=(T₁, …, Tₙ)是常见的

    n(L)=n(T₁) ⊕ … ⊕ n(T)ₙ)
    
    如果你的回合开始时敏捷度为0,你将失去你所做的一切,假设其他玩家玩得很完美

    否则,你只需要做一个动作,使敏捷变成零

    你可以这样做,因为如果
    n(L)>0
    那么有一个塔,让我们假设它是
    T,而不失去泛化ₙ,这样
    n(Tₙ) ⊕ n(L)

    这样的塔是存在的:最左边的
    n(L)
    位是
    1
    ,这是因为一些塔
    Tₙ在该位位置有一个1。执行
    n(Tₙ) ⊕ n(L)
    您杀死1,并且不改变
    n(t)的更重要位ₙ)n(L)
    的最左边的位ₙ) ⊕ n(L)
    较小

    那么您只需要修改
    Tₙ
    Tₙ'使得
    n(Tₙ') = n(T)ₙ) ⊕ n(L)
    ,因此

    n(L')=n(T₁) ⊕ … ⊕ n(T)ₙ') = n(T)₁) ⊕ … ⊕ n(T)ₙ) ⊕ n(L)=n(L)⊕ n(L)=0
    

    这种移动总是可能的,例如将高度降低到
    x'=p₁ˢimk_…pₗ₋₁ˢˡ⁻ñpₗᵈ,带
    l这是塔式断路器(等高)的答案。

    答复
    • 如果M是1,第二个玩家将获胜
    • 如果N为偶数(N%2==0)
    且M不是1,则第二名玩家将获胜
  • 如果N是奇数
    (N%2==1)
    而M不是1,则第一个玩家将获胜

这是我的C++代码。(它被接受)< /P>

#包括
使用名称空间std;
int Q,N,M;
int main(){
cin>>Q;
而(Q--){
cin>>N>>M;

如果(M==1 | | N%2==0)不能,我将此作为一个自我回答的问题重新发布,因为它已被机器人删除。我不希望我的答案丢失。我将投票关闭此问题,因为它与编程无关。@Kara,这是关于算法的,它是明确的
#include <bits/stdc++.h>
using namespace std;
int Q, N, M;
int main() {
    cin >> Q;
    while(Q--) {
        cin >> N >> M;
        if(M == 1 || N % 2 == 0) cout << 2 << endl;
        else cout << 1 << endl;
    }
}