中国剩余定理详解

中国剩余定理

孙子算经里有这样一个问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”

翻译成现在的数学问题就是 x%3 == 2,x%5 == 3,x%7 ==  2,求x 的值;

遇到这这样一个问题很多C语言初学者不禁会想到用暴力可以算出来,还要这样一个定理干嘛?

如果数据相当大呢?计算机就会计算相当困难。然而这个问题早早的就被孙子解决了。

求出3,5,7 两两中的最小公倍数lcm,k*lcm与另一个数mod等于1(找出一个符合条件的k);

用k*lcm*另一个没有在lcm中的数的等式的余数 
[(有点绕)就是 lcm(3,5),另一个数就是7 在x%7==2 的等式中的余数 就是2 即找出这k*lcm(3,5)*2]

求法(剩余定理思想):

Lcm(3,5) = 15;   // lcm是最小公倍数

Lcm(3,7) = 21;

Lcm(5,7) = 35;

a*15%7 == 1;

b*21%5 == 1;

c*35%3 == 1;

可求得a,b,c的值为1,1,2;

我们可得15%7 == 1 , 21%5 == 1 , 70%3 == 1;

Ans = (15*2 + 21*3 + 70*2) % lcm(3,5,7);

Ans = 23;

再加一个例题:

一个数被3除余1,被4除余2,被5除余4,这个数最小是几?

题中3、4、5三个数两两互质。 则〔4,5〕=20;〔3,5〕=15;〔3,4〕=12;〔3,4,5〕=60。

为了使20被3除余1,用20×2=40; 使15被4除余1,用15×3=45; 使12被5除余1,用12×3=36。

然后,40×1+45×2+36×4=274,

因为,274>60;

所以,274%60 = 34,就是所求的数。

粘个剩余定理题   
POJ 1006 http://poj.org/problem?id=1006

题目又上角有中文意思

这道题的解法就是:

已知(ans+d)%23=a;   (ans+d)%28=b;   (ans+d)%33=c

使33×28×X被23除余1,用33×28×8 = 5544;

使23×33×Y被28除余1,用23×33×19 = 14421;

使23×28×Z被33除余1,用23×28×2 = 1288。

于是X==8, Y==19, Z==2;

因此有(5544×a + 14421×b + 1288×c)% lcm(23,28,33) =ans + d

又23、28、33互质,即lcm(23,28,33) = 21252;

所以有ans =(5544×a+14421×b+1288×c-d)% 21252

AC代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int a, b, c, d,cnt=1;
	int ans;
	while (scanf("%d%d%d%d", &a, &b, &c, &d)!=EOF&&a!=-1)
	{
		ans = (a * 5544 + b * 14421 + c * 1288) % 21252;
		ans -= d;
		if (ans<=0) ans += 21252;
		if(ans>21252) ans=21252;
		printf("Case %d: the next triple peak occurs in %d days.\n", cnt++, ans);
	}
	return 0;
}

这个题暴力也能过

暴力AC代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int a, b, c, d,cnt=1,i;
    while (scanf("%d%d%d%d", &a, &b, &c, &d)!=EOF&&a!=-1)
    {
        for(i=1; ; i++)
            if((i-a)%23==0&&(i-b)%28==0&&(i-c)%33==0&&i>d)
            {
                break;
            }
            printf("Case %d: the next triple peak occurs in %d days.\n", cnt++, i-d);
    }
    return 0;
}

中国剩余定理详解

时间: 2024-10-25 21:55:01

中国剩余定理详解的相关文章

中国剩余定理—详解

定理描述: 中国剩余定理:求解同余式组的方法. 例如下面的一元线性同余方程组: x ≡ a1 (mod m1) x ≡ a2 (mod m2) x ≡ a3 (mod m3) . . . . . . x ≡ an (mod mn) 中国剩余定理:假设整数m1, m2, m3......, mn两两互质,则对于任意的整数a1, a2, a3...., x有解. 解决问题类型: 在<孙子算经>里有一个问题: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 计算及推导: 他的计算

扩展中国剩余定理(扩展CRT)详解

今天在$xsy$上翻题翻到了一道扩展$CRT$的题,就顺便重温了下 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$有一个微小的要求,就是$\forall i,j (m_i,m_j)=1$. 在某些情况下,这个式子无法被满足,这个时候就要用扩展$CRT$来求解了. 我们先假设我们只有两条方程要被求解,它们分别是: $\begin{cases} x\equiv c_1 \pmod{m_1}\\x\equiv c_2 \pmod{m_2}

spring--处理器拦截器详解——跟着开涛学SpringMVC

5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   5.1.1.常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时

RSA公钥算法详解

1970年左右科学家们开始思考公钥加密系统的可能性.经过科学家多年的研究,终于在1977年时,来自MIT的Ron Rivest,AdiShamir和Leonard Adlemn三个人合写了一篇论文,给出了至今仍然安全的公钥加密算法,即以三个人姓氏的首字母命名的RSA算法. RSA的过程步骤如下: 1)       找两个大质素p和q 2)       设n=p·q 算出m=(p-1)(q-1) 3)       找出e和d,使得 e·d mod = 1 (随便找出一个与m互质的数e,求解方程e·

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

扩展欧几里得(exgcd)与同余详解

exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子,就不用怕在计算时溢出了. 下面我会用与分别表示a与b的最大公约数与最小公倍数. 首先会来学扩欧的同学肯定都会欧几里得算法(即辗转相除法)了吧 而通过观察发现:,先除后乘防溢出. 所以与的代码如下: 1 inline int gcd(int a,int b) 2 {return (b==0)?a:gc

中国剩余定理(CRT) &amp; 扩展中国剩余定理(ExCRT)总结

中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前置知识点:\(Exgcd\) 这两个东西都是用来解同余方程组的 形如 \[ \left\{ \begin{aligned} x\equiv B_1(mod\ W_1)\x\equiv B_2(mod\ W_2)\ \cdots\x\equiv B_n(mod\ W_n)\\end{aligned} \rig

HTTP协议详解(真的很经典)

引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出.HTTP协议的主要特点可概括如下:1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POS

HTTP协议详解 (转)

转自 http://blog.csdn.net/gueter/article/details/1524447 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出.HTTP协议的主要特点可概括如下:1.支持客户/服务