中国剩余定理

扩展的中国剩余定理 中国剩余定理最早由中国古代数学家孙子(孙秀英)在《孙子算经》一书中提出。这本书是中国古代数学的重要著作之一,成书于4世纪至5世纪之间。中国剩余定理是一种用于求解一类线性同余方程组的定理。线性同余方程组是指形式为x ≡ b1 (mod n1), x ≡ b2 (mod n2), ..., x ≡ br (mod nr)的方程组,其中x是未知数,bi是已知的整数,ni是不同的正整数。中国剩余定理的由来是为了解决天文学和农业中的一些实际问题。 阅读详情

中国剩余定理:


类似于韩信点兵的问题。

求出方程 x = a[i](mod m[i]),mi互为素数

令Mi = m1*m2...*m[i-1]*m[i+1]*....

那么 gcd(Mi,mi) = 1.    故存在pi,qi使 Mi*pi + mi*qi = 1(扩展欧几里得)


令ei = Mi*pi

那么有  ei = 0(mod mj),j != i

       ei = 1(mod mj),j = i

所以:

e0*a0 + e1*a1 + ..... + en*an是方程的解,

在[ 0,m[0]*.....*m[n] )中只有唯一解,取模即可


poj 1006 模板题 

大意:

人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这天,人在对应的方面表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。


ll CRT(ll a[],ll m[],ll n)
{
    ll M = 1;
    for(ll i = 0; i < n; i++) M *= m[i];

    ll ret = 0;

    for(ll i = 0; i < n; i++)
    {
        ll x,y;
        ll tm = M/m[i];
        ex_gcd(tm,m[i],x,y);
        ret = (ret+tm*x*a[i])%M;
    }
    return (ret+M)%M;
}



poj 2891

求解mi不互素的问题,可以模仿中国剩余定理,两两合并

对于 x mod a0 = r0,可以知道最小值为 a0 + r0

若同时存在x mod a1 = r1 => (k0*a0 + r0)mod a1 = r1, 

那么 k1*a1 + r1 = k0*a0 + r0


于是得到 k0*a0 - k1*a1 = r1 - r0,利用扩展欧几里得可以求出x,公约数t

(但是前提是 a*m + b*n = gcd(a,b) ), 所以(r1 - r0)%t必需为0,否则不满足公式

于是我们可以得出k0 = x*(r1-r0)/t , x实际来自( a0*x + a1*y == gcd(a0,a1) )

所以这个公共的x1 = r0 + k0*x. 于是我们得到一个新的 a = x1  ,  r = x1 % lcm(a0,a1)


于是我们可以往后面慢慢推了。

假设有3对数: 8 4   :   7 3   : 12  7

x = 8*x0 + 4 = 7*x1 + 3   可以求出x为 11,于是把11作为r

a*t + r = 12*t1 + 7, 于是a要满足能同时除尽7和8,即它们的最小公倍数  /*个人见解


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps=1e-10;
const int inf = 0x3f3f3f;
const int maxn = 100005;

ll ans,d;
int flag;

ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
    ll ret;
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ret = ex_gcd(b,a%b,x,y);
    ll tmp =x;
    x = y;
    y = tmp-(a/b)*y;
    return ret;
}


ll get(ll m1,ll m2,ll a)
{
    ll x,y;
    d = ex_gcd(m1,m2,x,y);
    if(a % d != 0)                            //无法满足等式
    {
        flag = 0;
    }

    ll t = (x*(a/d)%m2+m2)%m2;               //得出要求的x1
    return t;
}

int main()
{
    ll m1,m2,a1,a2;
    ll k;
    while(scanf("%I64d",&k) != EOF)
    {
        flag = 1;
        scanf("%I64d%I64d",&m1,&a1);
        ans = a1;
        for(ll i = 1; i < k; i++)
        {
            scanf("%I64d%I64d",&m2,&a2);
            ll t = get(m1,m2,a2-a1);
            ans += (m1*t);
            m1 = m1*m2/d;                          //获得最小公倍数
            ans = (ans%m1+m1)%m1;
            a1 = ans;
        }
        if(!flag)
            printf("-1\n");
        else
            printf("%I64d\n",ans);
    }
    return 0;
}


hdu 1573

题意:

给你两组数a[],b[].让你求出≤n的正整数中,有多少个满足 x % a[i] = b[i]

感觉和上面那个差不多吧,合并后求出最小的值。 然后通过加所有数的最小公倍数得出结果


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps=1e-10;
const int inf = 0x3f3f3f;
const int maxn = 100005;
ll a[15];
ll b[15];
ll ans,d;
int flag;

ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
    ll ret;
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ret = ex_gcd(b,a%b,x,y);
    ll tmp =x;
    x = y;
    y = tmp-(a/b)*y;
    return ret;
}


ll get(ll m1,ll m2,ll a)
{
    ll x,y;
    d = ex_gcd(m1,m2,x,y);
    if(a % d != 0)                            //无法满足等式
    {
        flag = 0;
    }

    ll t = (x*(a/d)%m2+m2)%m2;               //得出要求的x1
    return t;
}

int main()
{
    ll m1,m2,a1,a2;
    ll  n;
    ll m;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&m);
        for(int i = 0; i < m; i++)
            scanf("%d",&a[i]);

        for(int j = 0; j < m; j++)
            scanf("%d",&b[j]);

        flag = 1;
        ans = b[0];
        m1 = a[0],a1 = b[0];
        for(ll i = 1; i < m; i++)
        {
            m2 = a[i],a2 = b[i];
            ll t = get(m1,m2,a2-a1);
            ans += (m1*t);
            m1 = m1*m2/d;                          
            ans = (ans%m1+m1)%m1;
            a1 = ans;
        }
        ll num = 0;
        while(ans <= n)
        {
            if(ans != 0)                          //正整数
                num ++;
            ans += m1;
        }
        if(!flag)
            printf("0\n");
        else
            printf("%I64d\n",num);
    }
    return 0;
}


中国剩余定理与扩展中国剩余定理 中国剩余定理(CRT) 我好蔡啊 不学这个东东我连任意模数NTTNTTNTT都学不了 问题 中国剩余定理用于求解同余方程组 {x≡a1(mod&ThinSpace;&ThinSpace;m1)x≡a2(mod&ThinSpace;&ThinSpace;m2)......x≡ak(mod&ThinSpace;&ThinSpace;mk) \left\{... 阅读详情

相关推荐

MagicDraw-需求图

MagicDraw学习笔记

木头征的博客 4135

扩展中国剩余定理

扩展中国剩余定理

weixin_49393180的博客 1708

技能伤害继承英雄属性【War3地图编辑器】

风暴之锤跟随山丘之王的力量增长

ArYe 2297

中国剩余定理【数论】

中国剩余定理

100days 2万+

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

Win10系统VS2019+Cmake+qhull_8.0.0环境配置

1 qhull 1.1 简要介绍 qhull是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等。 1.2 依赖库 qhull不依赖其他库。 1.3 源码包下载 qhull源码地址:github:https://github.com/qhull/qhull.git 2 Cmake构建项目 2.1 路径 源代码路径:D:/ThirdParty/qhull/qhull_8.0.0构建项目路径:D:/Thi.

wangchenxue的博客 2489

中国剩余定理以及扩展中国剩余定理

中国剩余定理必须有两两互质的条件;而扩展中国剩余定理没有限制(可能互质,也能不互质)。所以只记忆一个扩展中国剩余定理的板子就行.

qq_35650513的博客 3700

解析vCard 3.0:提取电子名片中的姓名

N:LastName;FirstName;;;END:VCARD和END:VCARD标记数据块的开始和结束。N字段存储结构化姓名(分号分隔)。FN字段为直接可读的显示名称。其他字段如TELEMAIL等保存联系信息。

qq_45797625的博客 2777

数论——中国剩余定理(CRT)

今天也是简简单单学了一下CRT,我感觉这个东西考的不多,其实理解一下,考的时候能记住就OK了,但是还是要理解其中的奥妙话不多说,先来看中国剩余定理。

2301_80475191的博客 1320

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 445

STM32开发 -- GPIO详解

之前有简单讲过GPIO工作模式和寄存器,还是有点没搞明白。这次需要全方位的看一下了。 一、数据手册 1、STM32F105RC引脚说明 可知:STM32F105RC 一共有4组IO口 一共16X3+3=51个IO GPIOA0~A15 GPIOB0~B15 GPIOC0~C15 GPIOD0~D2 2、程序定义 GPIO端口号 STM32F1...

不积跬步,无以至千里 5万+

【数论系列】 中国剩余定理与拓展中国剩余定理

在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。

这里是阿安的博客 3872

python实现DoIP基本通信(收发报文)

python实现DoIP基本通信(收发报文)

天赐好车的博客 894

中国剩余定理&扩展中国剩余定理 入门详解

中国剩余定理 例题 已知以下nnn同余方程: x≡a1(mod&amp;amp;amp;ThinSpace;&amp;amp;amp;ThinSpace;m1)x≡a_1(\mod m_1)x≡a1​(modm1​) x≡a2(mod&amp;amp;amp;ThinSpace;&amp;amp;amp;ThinSpace;m2)x≡a_2(\mod m_2)x≡a2​(modm2​) x≡a3(mod&amp;amp;amp;ThinSpace;&

ZSJZ_liuzian的博客 992

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

中国剩余定理&扩展中国剩余定理学习笔记

详细讲解了中国剩余定理和扩展中国剩余定理,并给出推导证明以及模板

zhanxufeng的博客 735

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

中国剩余定理&扩展中国剩余定理

那么就有ax+by=k*gcd(a,b),那么我们知道x0,y0是ax+by=gcd(a,b)的一组解时那么他的特解就是k*x0,ky0;(其中通过d=exgcd(a,b,x,y),lcm(a1,a2)=a1*a2/d;同余方程:x≡a(mod b) <=> x(mod b)=a(mod b) <=> x%b=a%b;a/b=a*b^(-1)(表示逆元)=a/b*b*b^(-1)(mod p)那么如果求ax+by=c的一组解的话 其有解当且仅当 gcd(a,b)|c,c能把gcd(a,b)整除掉。

m0_73830679的博客 2399

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【数论】中国剩余定理(CRT) && 扩展中国剩余定理(EXCRT)

利用中国剩余定理与扩展中国剩余定理求解线性同余方程组

2401_87820834的博客 1135

中国剩余定理 && 扩展中国剩余定理

同余

niiick 2万+

中国剩余定理&拓展中国剩余定理

复习 中国剩余定理: x≡a1(modm1)x ≡a_1(mod m_1)x≡a1​(modm1​) x≡a2(modm2)x ≡a_2(mod m_2)x≡a2​(modm2​) x≡a3(modm3)x ≡a_3(mod m_3)x≡a3​(modm3​) … x≡(anmodmn)x ≡(a_nmod m_n)x≡(an​modmn​) 有整数解 x=∑ni=1aiMiti\sum_{n}^...

行走天涯的豆沙包的博客 302
上一篇: Math
下一篇: hdu 5607 BestCoder Round #68 (矩阵快速幂)
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值