数学知识第六期 中国剩余定理

前言

中国剩余定理也要学好的哈,共勉!!!

一、中国剩余定理的介绍

中国剩余定理释义:又称“孙子定理”。1852年,英国来华传教士伟烈亚力将《孙子算经》中“物不知数”问题的解法传至欧洲。1874年,英国数学家马西森指出此法符合1801年由高斯得出的关于同余式解法的一般性定理,因而西方称之为“中国剩余定理”。

孙子定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国余数定理。一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。

二、例题及模板

表达整数的奇怪方式:

AC代码:

// P1495 中国剩余定理
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
using LL = long long ;
LL a[N], m[N], M = 1;
int n;

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;
}

// 中国剩余定理的模板
LL CRT() {
    LL ans = 0;
    for (int i = 1; i <= n; i ++ ) {
        LL Mi = M / m[i];
        LL x, y;
        exgcd(Mi, m[i], x, y);  // 利用扩展欧几里得求出x和y
        // 此时的x就是Mi模mi意义下的逆元
        ans = ((ans + a[i] * Mi * x) % M + M) % M;  // 保证最小正整数解
    }
	// 这里也可以写成reutnr ans  因为上面已经保证求出来的ans是最小正整数解了
    return (ans % M + M) % M;   // 保证最小正整数解
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) {
        // 这里m[i]就是题目中猪圈数,a[i]就是无家可归的猪数
        scanf("%lld%lld", &m[i], &a[i]);
        M *= m[i];  // 累乘每个式子中模数mi  得到M
    }
    printf("%lld\n", CRT());
    return 0;
}

总结

感谢大家的观看,谢谢大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值