数学知识:中国剩余定理

本文介绍了中国剩余定理的基本概念,并结合AcWing204题——表达整数的奇怪方式,进行了详细解析。通过AC代码展示了如何应用孙子定理解决实际问题,虽然原题并未限制两两互质,但依然可以通过变形求解。遗憾的是,文章暂时未给出时间复杂度的详细分析和证明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

复习acwing算法基础课的内容,本篇为讲解数学知识:中国剩余定理,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、中国剩余定理

即孙子定理,具体定理即推导见:孙子定理,注意中国剩余定理必须要求两两互质,本博客例题中没有限制两两互质,故不能直接套用中国剩余定理的公式,需要在基础之上进行变形


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

本题链接:AcWing 204. 表达整数的奇怪方式
本博客提供本题截图:
在这里插入图片描述

本题解析

理论推导见OI爷的博客:墨染空 ,

AC代码

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;


LL exgcd(LL a, LL b, LL &x, LL &y)
{
    if (!b)
    {
        x = 1, y = 0;
        return a;
    }

    LL d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}


int main()
{
    int n;
    cin >> n;

    LL x = 0, m1, a1;
    cin >> m1 >> a1;
    for (int i = 0; i < n - 1; i ++ )
    {
        LL m2, a2;
        cin >> m2 >> a2;
        LL k1, k2;
        LL d = exgcd(m1, -m2, k1, k2);
        if ((a2 - a1) % d)
        {
            x = -1;
            break;
        }

        k1 *= (a2 - a1) / d;
        k1 = (k1 % (m2/d) + m2/d) % (m2/d);

        x = k1 * m1 + a1;

        LL m = abs(m1 / d * m2);
        a1 = k1 * m1 + a1;
        m1 = m;
    }

    if (x != -1) x = (x % m1 + m1) % m1;

    cout << x << endl;

    return 0;
}

三、时间复杂度

关于中国剩余定理各步操作的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值