首页 > 其他分享 >中国剩余定理——AcWing 204. 表达整数的奇怪方式

中国剩余定理——AcWing 204. 表达整数的奇怪方式

时间:2024-06-18 18:30:26浏览次数:12  
标签:k01 204 int 定理 a1 a2 m1 m2 AcWing

中国剩余定理

定义

中国剩余定理最早出自我国古代的《孙子算经》,是数论中的一个重要定理。它描述了这样一种情况:在模运算下,对于一组线性同余方程组,存在唯一解的条件和求解方法。

运用情况

常用于在一些涉及到按不同模的余数条件下求解问题。比如在密码学、计算数论、计算机科学等领域中,当需要处理多个模条件相关的计算时,常常会用到中国剩余定理。

注意事项

  • 要求各个模之间互质,否则定理不直接适用,可能需要进行一些转化处理。
  • 在计算过程中要保证计算的准确性,尤其是涉及到较大数的运算时。

解题思路

AcWing 204. 表达整数的奇怪方式   

题目描述

AcWing 204. 表达整数的奇怪方式 - AcWing

运行代码

#include <iostream>
#define int long long
using namespace std;
int n;
int exgcd(int a, int b, int &x, int  &y)
{
    if(!b)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
signed main()
{
    bool st = true;
    cin >> n;
    int a1, m1;
    cin >> a1 >> m1;
    for(int i = 2; i <= n; i ++ )
    {
        int a2, m2, k01, k02, d;
        cin >> a2 >> m2;
        d = exgcd(a1, a2, k01, k02);
        if((m2 - m1) % d) 
        {
            st = false;
            break;
        }
        k01 = k01 * (m2 - m1) / d;
        k01 = (k01 % (a2 / d) + (a2 / d)) % (a2 / d);
        m1 += a1 * k01;
        a1 = a1 / d * a2;
    }
    if(st) cout << (m1 % a1 + a1) % a1 << endl;
    else cout << -1 << endl;
    return 0;
} 

代码思路

  1. 类型定义与变量初始化

    • 使用 #define int long long 将整型变量默认定义为长整型,以处理大数。
    • 定义全局变量 n 表示同余方程的数量。
  2. 扩展欧几里得算法(exgcd): 实现了扩展欧几里得算法,用于求解形如 ax + by = gcd(a, b)ax+by=gcd(a,b) 的方程。返回值 d 是 aa 和 bb 的最大公约数(GCD),同时通过引用参数 xy 返回系数。这个函数是解决CRT的关键,用于寻找模数之间的关系。

  3. 主函数(main)

    • 首先读入同余方程的数量 n
    • 初始化第一个方程的系数 a1 和模数 m1
    • 对于每个后续的方程(从第二个到第 n 个),执行以下操作:
      • 读取当前方程的系数 a2 和模数 m2
      • 使用 exgcd 函数计算 a1 和 a2 的最大公约数 d,以及对应的系数 k01k02
      • 检查是否存在解:如果 (m2 - m1)(m2−m1) 不能被 d 整除,则说明无解,标记 st 为 false 并跳出循环。
      • 如果有解,根据中国剩余定理调整 m1 和 a1,使得它们分别表示合并后的同余方程的临时解和新模数。
    • 最后,根据 st 的值输出结果:如果为 true,则输出满足所有同余条件的最小非负整数解;否则,输出 -1 表示无解。

改进思路

  1. 使用更明确的变量名:虽然简短的变量名让代码紧凑,但更具有描述性的名称可以提高代码的可读性。例如,可以将 a1, a2, m1, m2 等变量名改为 current_coefficient, next_coefficient, current_modulus, next_modulus 等。

  2. 避免全局变量:全局变量 n 可能导致代码的维护和理解难度增加,尤其是在大型项目中。可以考虑将其作为函数参数传递。

  3. 优化解的计算和输出

    • 直接计算最终解而不仅仅是累积操作。在循环结束后,可以计算最终的 x(即满足所有同余方程的解)并直接取模,避免最后对 a1 进行额外的模运算。
    • 输出解时,使用 % 运算符可能两次取模,实际上 (m1 % a1 + a1) % a1 可以简化为 (m1 % a1),因为当 m1 < 0 时,(m1 + a1) % a1 已经保证结果非负。
  4. 增加错误处理和注释:对于输入验证(如检查模数是否两两互质、是否为正整数等)添加更多的错误处理逻辑,并在关键步骤添加注释,帮助读者理解算法逻辑。

  5. 模块化设计:将中国剩余定理的求解过程封装成一个独立的函数,而不是全部放在 main 函数中,这样可以提高代码的复用性和可测试性。

  6. 考虑大数运算库:如果要处理非常大的数字,可以考虑使用专门的大数运算库(如 GMP 库),这会比直接使用 C++ 内置数据类型更高效且支持更大的数值范围。

  7. 优化扩展欧几里得算法的实现:虽然现有实现是标准的,但在某些特定情况下,可以通过一些小技巧进一步优化,比如利用幂次计算减少递归深度,或是迭代法替代递归以节省栈空间。

标签:k01,204,int,定理,a1,a2,m1,m2,AcWing
From: https://blog.csdn.net/u014114223/article/details/139770206

相关文章

  • 绸带最终定理
    复习的东西屁用没有捏。\[\newcommand{\Aut}{\operatorname{Aut}}\newcommand{\Gal}{\operatorname{Gal}}\]若交换幺环唯二理想为零和自身,则其为域,反之亦然。若普通幺环唯二理想为零和自身,其不一定为除环。交换幺环中极大理想的商环为域,而普通幺环中极大理想的商环不一......
  • [lnsyoj509/AcWing99]约数之和
    题意原题链接求\(A^B\)的约数之和\(\bmod9901\)sol\(x\)的约数之和\(f(x)\)可以通过以下公式计算根据算数基本定理,将\(x\)分解为$$\prod_{i=1}^ka_i^{p_i}$$则$$f(x)=\prod_{i=1}^k\sum_{j=0}^{p_i}a_i^j=\prod_{i=1}^k\frac{a_i^{p_i+1}-1}{a_i-1}$$证明根据......
  • 通信原理抽样定理和PAM调制解调硬件实验
    一、实验目的1.加深理解抽样定理;2.加深理解脉冲幅度调制的原理。二、实验内容1. 观测PAM平顶抽样波形;2. 观测PAM自然抽样波形及解码后波形。三、实验器材1.双踪示波器;2.通信原理实验箱信号源模块、①号模块。四、实验步骤1.观测PAM平顶抽样波形(1)用示波器观测......
  • AcWing 668. 游戏时间2***
    题目描述读取四个整数A,B,C,D,用来表示游戏的开始时间和结束时间。其中A和B为开始时刻的小时和分钟数,C和D为结束时刻的小时和分钟数。请你计算游戏的持续时间。比赛最短持续1分钟,最长持续24小时。输入格式共一行,包含四个整数A,B,C,D。输出格式输出格式为OJ......
  • AcWing 738.数组填充(c++)
    题目描述输入一个整数V,输出一个长度为10的数组N,数组中的第一个元素为V,每个后续元素的值都为上一个元素的值的2倍。例如,如果输入整数为1,则数组为:1,2,4,8…输入格式输入一个整数V。输出格式输出数组中的所有元素,每个元素占一行。输出格式为N[i]=x,其中i为......
  • CF1204E = 998244853.
    CF1204E=998244853.Natasha,SashaandthePrefixSumsNaCly_Fish最喜欢的数字是\(n\)和\(1\);\(\mathsfE\color{red}\mathsf{ntropyIncreaser}\)最喜欢\(m\)和\(-1\)。有一天,她们在一起写出了一个长度为\(n+m\),有\(n\)个\(1\)和\(m\)个\(-1\)的序列\(......
  • PS2045L-ASEMI低Low VF肖特基PS2045L
    编辑:llPS2045L-ASEMI低LowVF肖特基PS2045L型号:PS2045L品牌:ASEMI封装:TO-277最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):45V最大正向电压(VF):0.24V~0.39V工作温度:-55°C~150°C反向恢复时间:5ns芯片个数:1芯片尺寸:50mil引脚数量:2正向浪涌电流(IFMS):300A包装方式:50/管1......
  • acwing 247 亚特兰蒂斯
    https://www.acwing.com/problem/content/249/有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述。其中一些甚至包括岛屿部分地图。但不幸的是,这些地图描述了亚特兰蒂斯的不同区域。您的朋友Bill必须知道地图的总面积。你自告奋勇写了一个计算这个总面积的程序。输......
  • AcWing 655 天数转换
    读取对应于一个人的年龄(以天为单位)的整数值,并转化为年,月和日表示方式输出,年、月、日分别对应ano(s),mes(es),dia(s)。注意:为了方便计算,假设全年365天,每月30天。数据保证,不会出现12个月和几天的情况,例如360,363或364。输入格式输入一个整数N。输出格式参照输......
  • acwing 656 钞票和硬币
    读取一个带有两个小数位的浮点数,这代表货币价值。在此之后,将该值分解为多种钞票与硬币的和,每种面值的钞票和硬币使用数量不限,要求使用的钞票和硬币的总数量尽可能少。钞票的面值是100,50,20,10,5,2硬币的面值是1,0.50,0.25,0.10,0.05和0.01经过实验证明:在本题中,优先......