Who is better?(斐波那契博弈+拓展中国剩余定理)

题目链接:Who is better?

题意:
两个人玩游戏,游戏规则如下:
有一堆个数为n的石子,游戏双方轮流取石子,满足:

  1. 先手不能在第一次把所有的石子取完;
  2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。
  3. 约定取走最后一个石子的人为赢家,求必败态。

现在给你 m 行 a 和 b 表示 n ≡ b (mod a)。
让你求出 n 。之后根据求出的 n 判断
先手赢输出 “Lbnb!”
先手输输出 “Zgxnb!”
n 不存在输出 “Tankernb!”

思路:

  1. 题目就是裸的斐波那契博弈,裸得不能再裸了,然后重点就是求 n ,但是求 n 就又是裸的拓展中国剩余定理······就很无语

斐波那契博弈:斐波那契博弈

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<unordered_map>
#define inf 0x3f3f3f3f
using namespace std;

typedef long long ll;

const int N = 1010;

int n;
ll m[N],a[N];

ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x=1, y = 0;
        return a;
    }
    ll ret = exgcd(b, a % b, y, x);
    y -= (a / b) * x;
    return ret;
}
ll work()
{
    ll M = m[1], A = a[1], t, d, x, y;
    for(int i = 2; i <= n; i++)
    {
        d = exgcd(M, m[i], x, y);
        if((a[i] - A) % d) return -1;
        x *= (a[i] - A) / d, t = m[i] / d, x = (x % t + t) % t;
        A = M * x + A, M = M / d * m[i], A %= M;
    }
    A = (A % M + M) % M;
    return A;
}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld %lld", &m[i], &a[i]);
    }
    ll ans = work();
    if(ans == -1)
    {
        printf("Tankernb!\n");
    }
    else
    {
        ll pre1 = 0;
        ll pre2 = 1;
        ll sum = 0;
        while(sum < ans)
        {
            sum = pre1 + pre2;
            pre1 = pre2;
            pre2 = sum;
        }
        if(sum == ans)
        {
            printf("Lbnb!\n");
        }
        else
        {
            printf("Zgxnb!\n");
        }
    }
    return 0;
}

<think>好的,我需要回答用户关于中国剩余定理的压缩实现或算法的问题。首先,我要确保自己对中国剩余定理(CRT)有足够的理解。中国剩余定理是数论中的一个重要定理,用于解决一组同余方程的问题,特别是在模数两两互质的情况下,可以找到一个唯一的解模这些模数的乘积。 接下来,用户提到了“压缩算法实现”。这里的“压缩”可能指的是如何高效或优化地实现CRT,尤其是在处理多个同余方程时,如何合并这些方程,减少计算量或存储空间。我需要考虑现有的CRT实现方法,尤其是扩展中国剩余定理(exCRT),它处理模数不互质的情况,这可能与用户的问题相关。 根据参考内容,引用[3]提到了扩展中国剩余定理(exCRT),这可能对处理非互质模数有帮助。因此,我需要解释exCRT的基本步骤,以及如何通过递推合并方程来逐步求解,这可能是压缩实现的一部分。 另外,用户可能关心的是如何优化存储或计算步骤。例如,在合并两个同余方程时,如何有效计算模数和余数,避免重复计算或减少中间变量的存储。这可能涉及到数学上的优化,比如利用贝祖定理求解线性同余方程,或者处理模数不互质时的调整。 我还需要考虑代码实现,用户可能希望看到具体的算法步骤或代码示例。但根据系统级指令,代码必须用正确的格式,并且用户要求的是压缩实现,所以可能需要展示一个高效的算法结构,比如循环合并方程,每次处理两个方程,直到所有方程合并完成。 另外,引用[2]提到空间复杂度的重要性,因此在实现时需要考虑如何减少内存使用。例如,在合并过程中逐步更新当前的解和模数,而不是保留所有中间结果,这样可以节省空间。 需要验证的是,合并过程中的每一步是否正确,如何处理模数不互质的情况,以及如何确保解的存在性。例如,当两个方程的解不满足合并条件时,整个系统无解,此时需要抛出错误或处理异常。 最后,生成相关问题需要考虑用户可能进一步感兴趣的方面,比如exCRT的应用场景、优化方法的时间复杂度,或者与其他数论问题的结合,如引用[3]提到的斐波那契数列的循环节问题。 总结来说,我需要分步骤解释中国剩余定理的压缩实现,可能包括exCRT的递推合并方法,代码示例,以及优化存储和计算的策略,同时引用相关参考文献,并生成相关问题。</think>### 中国剩余定理的压缩实现 中国剩余定理(CRT)用于求解同余方程组: $$x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \vdots \\ x \equiv a_n \pmod{m_n}$$ 当模数两两互质时,存在唯一解模$M = m_1 \cdot m_2 \cdots m_n$。 **压缩实现的核心在于逐步合并方程,减少重复计算**,尤其在模数不互质时需使用扩展中国剩余定理(exCRT)[^3]。 --- #### 算法步骤(exCRT递推合并) 1. **初始化**:令当前解$x = a_1$,当前模数$M = m_1$。 2. **逐次合并**: - 对第$i$个方程$x \equiv a_i \pmod{m_i}$,需满足: $$x + k \cdot M \equiv a_i \pmod{m_i} \quad (k \text{为整数})$$ - 化简为线性同余方程: $$k \cdot M \equiv a_i - x \pmod{m_i}$$ - 用扩展欧几里得算法求$k$,若无解则整个系统无解。 - 更新解和模数: $$x' = x + k \cdot M \\ M' = \text{lcm}(M, m_i)$$ 3. **最终解**:$x \bmod M'$。 --- #### 代码实现(Python) ```python def exCRT(a_list, m_list): from math import gcd x, M = 0, 1 # 初始解和模数 for ai, mi in zip(a_list, m_list): d = gcd(M, mi) if (ai - x) % d != 0: return -1 # 无解 # 解方程 k*M ≡ (ai - x) (mod mi) _, k, _ = extended_gcd(M, mi) k *= (ai - x) // d x += k * M M = (M * mi) // d # 更新为最小公倍数 x %= M # 保持最小非负解 return x def extended_gcd(a, b): if b == 0: return a, 1, 0 else: g, x, y = extended_gcd(b, a % b) return g, y, x - (a // b) * y ``` --- #### 优化与压缩 1. **空间优化**:仅维护当前解$x$和模数$M$,无需存储所有中间结果[^2]。 2. **计算优化**:使用递推合并代替递归,减少栈空间占用。 3. **并行化潜力**:若方程分组互质,可分组并行合并后再次合并。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值