中国剩余定理

【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms

*爱你&永不变心* 提交于 2020-01-09 18:34:19
题目链接:    http://poj.org/problem?id=1006    http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意 :   (X+d)%23=a1,(X+d)%28=a2,(X+d)%33=a3,给定a1,a2,a3,d,求最小的X。 题目思路:    【中国剩余定理】    23,28,33互素,可以套中国剩余定理。   也可以直接手算逆元。   33×28×a模23的逆元为8,则33×28×8=5544;   23×33×b模28的逆元为19,则23×33×19=14421;   23×28×c模33的逆元为2, 则23×28×2=1288。   因此有(5544×p+14421×e+1288×i)%lcm(23,28,33)=n+d (lcm(23,28,33)= 21252)   所以n=(5544×p+14421×e+1288×i-d)%21252   本题所求的是最小整数解,避免n为负,因此最后结果 n=(n+21252)% 21252   so n=(5544*p+14421*e+1288*i-d+21252)%21252;    1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include

POJ1006: 中国剩余定理的完美演绎

岁酱吖の 提交于 2019-12-23 22:09:54
问题描述 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。 问题分析 首先我们要知道,任意两个峰值之间一定相距整数倍的周期。假设一年的第N天达到峰值,则下次达到峰值的时间为N+Tk(T是周期,k是任意正整数)。所以,三个峰值同时出现的那一天(S)应满足 S = N1 + T1*k1 = N2 + T2*k2 = N3 + T3*k3 N1,N2,N3分别为为体力,情感,智力出现峰值的日期, T1,T2,T3分别为体力,情感,智力周期。 我们需要求出k1,k2,k3三个非负整数使上面的等式成立。 想直接求出k1,k2,k3貌似很难,但是我们的目的是求出S, 可以考虑从结果逆推。根据上面的等式,S满足三个要求:除以T1余数为N1,除以T2余数为N2,除以T3余数为N3。这样我们就把问题转化为求一个最小数,该数除以T1余N1,除以T2余N2,除以T3余N3。这就是著名的中国剩余定理,我们的老祖宗在几千年前已经对这个问题想出了一个精妙的解法。依据此解法的算法,时间复杂度可达到O(1)。下面就介绍一下中国剩余定理。

中国剩余定理(解一元线性同余方程组)

余生颓废 提交于 2019-12-20 01:10:39
中国剩余定理(解一元线性同余方程组) 问题:   在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。 解析:   题目意思即为有这样一组方程: (m1---mn两两互质) 设: 设: 设: 所以: 所以方程有解为: 查找modM意义下,或最小正整数解:方程有唯一解: 注释:假设整数m1,m2,m3...mn两两互质,则对于任意整数a1,a2,a3...an,x有解 例: 对于 x % 3 = 2 x % 5 = 3 x % 7 = 2 我们需要构造一个答案 //inv为求逆元 5*7*inv(5*7, 3) % 3 = 1 3*7*inv(3*7, 5) % 5 = 1 3*5*inv(3*5, 7) % 7 = 1 然后两边同乘你需要的数,得 2 * 5*7*inv(5*7, 3) % 3 = 2 3 * 3*7*inv(3*7, 5) % 5 = 3 2 * 3*5*inv(3*5, 7) % 7 = 2 令 a = 2 * 5*7*inv(5*7, 3) b = 3 * 3*7*inv(3*7, 5) c = 2 * 3*5*inv(3*5, 7) 那么 a % 3 = 2 b % 5 = 3 c % 7 = 2

中国剩余定理(模板+详解)

浪尽此生 提交于 2019-12-18 04:15:20
问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何? 简单点说就是,存在一个数x,除以3余2,除以5余三,除以7余二,然后求这个数。上面给出了解法。再明白这个解法的原理之前,需要先知道一下两个定理。 定理1:几个数相加,如果存在一个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。 定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。 以上两个定理随便个例子即可证明! 现给出求解该问题的具体步骤: 1、求出最小公倍数 lcm=3*5*7=105 2 、 求各个数所对应的基础数 (1)105÷3=35 35÷3=11......2 //基础数35 (2)105÷5=21 21÷5=4......1 定理2把1扩大3倍得到3,那么被除数也扩大3倍,得到21*3=63//基础数63 3 、 105÷7=15 15÷7=2......1 定理2把1扩大2倍得到2,那么被除数也扩大2倍,得到15*2=30//基础数30 把得到的基础数加和(注意:基础数不一定就是正数) 35+63+30=128 4 、 减去最小公倍数lcm(在比最小公倍数大的情况下) x=128-105=23 那么满足题意得最小的数就是23了。一共有四个步骤。下面详细解释每一步的原因。 (1)最小公倍数就不解释了,跳过

中国剩余定理(孙子定理)

笑着哭i 提交于 2019-12-13 01:17:13
主要是求解模不同的数同余的问题。 eg:《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?” 板子 # include <iostream> # include <cstdio> # include <cstring> # include <string> using namespace std ; typedef long long LL ; const int maxn = 100000 + 10 ; LL a [ maxn ] , m [ maxn ] , n ; LL ex_gcd ( LL a , LL b , LL & x , LL & y ) { //拓展欧几里得 if ( b == 0 ) { x = 1 ; y = 0 ; return a ; } LL ans = ex_gcd ( b , a % b , x , y ) ; LL temp = x ; x = y ; y = temp - a / b * y ; return ans ; } LL inv ( LL a , LL b ) { //求逆元 LL x , y ; LL ans = ex_gcd ( a , b , x , y ) ; if ( ans != 1 ) return - 1 ; if ( x <

POJ 1006 Biorhythms (数论-中国剩余定理)

允我心安 提交于 2019-12-07 12:50:44
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 111285 Accepted: 34638 Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical, emotional, and intellectual cycles, and they have periods of lengths 23, 28, and 33 days, respectively. There is one peak in each period of a cycle. At the peak of a cycle, a person performs at his or her best in the corresponding field (physical, emotional or mental). For example, if it is the mental curve, thought processes will be sharper and

Rabin算法

。_饼干妹妹 提交于 2019-12-06 06:49:47
中国剩余定理 如果已知 n 的素因子,那么就能够利用中国剩余定理求解方程组。用现代数学的语言来说明就是,中国剩余定理给出了以下的一元线性同余方程组有解的判定条件: 一般而言,如果 n 的素因子可以分解为: \[ n=p_1 * p_2 * ... * p_t \] 那么方程组: \[ (x \quad mod \quad p_i)=a_i \quad (i=1,2,...t) \] 有唯一解,这里 x<n ,就是说一个数被他的余数模这些素数唯一确定 例如,去两个素数2和5,与一个数字9,那么 9 mod 2=1 , 9 mod 5=4 ,则小于2*5=10且满足上式的只有9 所以能够得到如果对已任意的 a<p,b<q (p,q都是素数),那么,当 x<p*q 的时候,存在一个唯一的 x 使得: \[ x \equiv a(mod \quad p)\quad 且\quad x\equiv b(mod \quad q) \] 如何计算 x ? 首先通过 欧几里得算法 找到 u ,使得: \[ u * q \equiv 1(mod \quad p) \] 然后计算: \[ x=(((a-b) * u) mod \quad p)*q+b \] 推论: 如果 p 和 q 都是素数,且 p<q ,那么存在一个唯一的 x<p*q ,使得 \[ a \equiv x(mod \quad p)且b

中国剩余定理(解一元线性同余方程组)

牧云@^-^@ 提交于 2019-12-05 01:15:47
问题:   在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。 解析:   题目意思即为有这样一组方程: (m1---mn两两互质) 设: 设: 设: 所以: 所以方程有解为: 查找modM意义下,或最小正整数解:方程有唯一解: 注释:假设整数m1,m2,m3...mn两两互质,则对于任意整数a1,a2,a3...an,x有解 例: 对于 x % 3 = 2 x % 5 = 3 x % 7 = 2 我们需要构造一个答案 //inv为求逆元 5*7*inv(5*7, 3) % 3 = 1 3*7*inv(3*7, 5) % 5 = 1 3*5*inv(3*5, 7) % 7 = 1 然后两边同乘你需要的数,得 2 * 5*7*inv(5*7, 3) % 3 = 2 3 * 3*7*inv(3*7, 5) % 5 = 3 2 * 3*5*inv(3*5, 7) % 7 = 2 令 a = 2 * 5*7*inv(5*7, 3) b = 3 * 3*7*inv(3*7, 5) c = 2 * 3*5*inv(3*5, 7) 那么 a % 3 = 2 b % 5 = 3 c % 7 = 2 其实答案就是a+b+c 因为 a%5

中国剩余定理

不打扰是莪最后的温柔 提交于 2019-12-05 00:19:50
中国剩余定理 其实 \(EX\) 很简单,和普通几乎一样,先上普通版只是心理缓冲 为什么普通版还没淘汰啊 。 作用: 解线性同余方程 组 。 即: \[ \begin{cases} x\equiv a_1\quad(mod\;m_1)\\ x\equiv a_2\quad(mod\;m_2)\\ \quad \dots\\ x\equiv a_k\quad(mod\;m_k)\\ \end{cases} \] 限定: \(m\) 之间两两互质。 方式: 分别解: \[ \begin{cases} x\equiv a_1\quad(mod\;m_1)\\ x\equiv 0\quad(mod\;m_2)\\ \quad \dots\\ x\equiv 0\quad(mod\;m_k)\\ \end{cases} \begin{cases} x\equiv 0\quad(mod\;m_1)\\ x\equiv a_2\quad(mod\;m_2)\\ \quad \dots\\ x\equiv 0\quad(mod\;m_k)\\ \end{cases} \begin{cases} x\equiv 0\quad(mod\;m_1)\\ x\equiv 0\quad(mod\;m_2)\\ \quad \dots\\ x\equiv a_k\quad(mod\;m_k)\\ \end

中国剩余定理(孙子定理)详解

风流意气都作罢 提交于 2019-12-04 02:10:15
问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何 ? 简单点说就是,存在一个数x,除以3余2,除以5余三,除以7余二,然后求这个数。上面给出了解法。再明白这个解法的原理之前,需要先知道一下两个定理。 定理1:两个数相加,如果存在一个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。 定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。 以上两个定理随便个例子即可证明! 现给出求解该问题的具体步骤: 1、求出最小公倍数 lcm=3*5*7=105 2 、 求各个数所对应的基础数 (1)105÷3=35 35÷3=11......2 //基础数35 (2)105÷5=21 21÷5=4......1 定理2把1扩大3倍得到3,那么被除数也扩大3倍,得到21*3=63//基础数63 3 、 105÷7=15 15÷7=2......1 定理2把1扩大2倍得到2,那么被除数也扩大2倍,得到15*2=30//基础数30 把得到的基础数加和(注意:基础数不一定就是正数) 35+63+30=128 4 、 减去最小公倍数lcm(在比最小公倍数大的情况下) x=128-105=23 那么满足题意得最小的数就是23了。一共有四个步骤。下面详细解释每一步的原因。 (1)最小公倍数就不解释了,跳过