拓展中国剩余定理解决模数不互质同余方程组

如果模数互质的话,直接中国剩余定理就可以了

但是如果模数不互质又没有接触这个方法就凉凉了

推是很不好推出来的

假设我们这里有两个方程:

x=a1?x1+b1

x=a2?x2+b2

a1,a2是模数,b1,b2是余数

那么我们可以合并这两个方程:

a1?x1+b1=a2?x2+b2

由于x1和x2可以取负无穷到正无穷,所以符号不能约束它们,我们随便变一变形得到

a1?x1+a2?x2=b2?b1

然后使用拓展欧几里德算法,x和y分别是式子中的x1和x2

我们求出了一个最小正整数解x1

令k=(a1?x1+b1)

x≡k(mod lcm(a1,a2))

一路合并下去就可以得到最终的解答了

典型例题是POJ2891,全网仅此一道??

POJ真是交上去立刻A

 1 #include<cstdio>
 2 using namespace std;
 3 const int maxn=100005;
 4 int n;
 5 long long a[maxn],m[maxn];
 6 long long exgcd(long long a,long long b,long long &x,long long &y)
 7 {
 8     if(b==0) {x=1;y=0;return a;}
 9     long long ret=exgcd(b,a%b,x,y);
10     long long t=x;x=y;y=t-a/b*y;
11     return ret;
12 }
13 long long crt()
14 {
15     long long M=m[1],A=a[1];
16     long long x,y;
17     for(int i=2;i<=n;i++)
18     {
19         long long d=exgcd(M,m[i],x,y);
20         if((a[i]-A)%d) return -1;  //无解
21         //计算x的值
22         x*=(a[i]-A)/d;
23         long long t=m[i]/d;
24         x=(x%t+t)%t;
25         A=M*x+A;
26         M=M/d*m[i];
27         A%=M;
28     }
29     A=(A%M+M)%M;
30     return A;
31 }
32 int main()
33 {
34     while(scanf("%d",&n)==1)
35     {
36         for(int i=1;i<=n;i++)
37             scanf("%lld%lld",&m[i],&a[i]);
38         printf("%lld\n",crt());
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/aininot260/p/9483902.html

时间: 2024-10-08 22:06:10

拓展中国剩余定理解决模数不互质同余方程组的相关文章

拓展中国剩余定理(exCRT)摘要

清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{1}} \\x \equiv b_{2}\pmod{a_{2}} \\...\\x \equiv b_{n}\pmod{a_{n}} \\ \end{cases}$$的线性同余方程组的解 具体过程 假设现在我们只有两个同余方程$$x \equiv b_{1}\pmod{a_{1}}$$ $$x \e

学习拓展中国剩余定理小结

前言 话说中国剩余定理好早就会了,但是一直木有接触过拓展的. 只知道它是个什么东东. 最近似乎需要它了,稍微学了学,似乎还挺简单的. 小结一下~ 简介 中国剩余定理我们都懂吧? 而拓展则是把它后面的模数变成一个非质数,(当然,各个方程的模数互质). 然后求出最小的x的解. 做法 似乎拓展之后很难用原来的套路来搞了. 怎么办? 我们发现,我们可以利用一些奇怪的推柿子大法来合并柿子. 考虑合并一下两个柿子: \(x \equiv c1 (mod\ m1)\) \(x \equiv c2 (mod\

poj 2891 模数不互质的中国剩余定理

Strange Way to Express Integers Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is described as following: Choose k different positive integers a1, a2, -, ak. For some

拓展中国剩余定理(不互质的情况)

每次合并两个同余模方程,然后用exgcd解即可. ll LCM(ll a,ll b) { return a/__gcd(a,b)*b; } void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0){ x=1;y=0;d=a; return; } exgcd(b,a%b,d,y,x); y-=x*(a/b); } ll MLE(ll a,ll b,ll n) { ll x,y,d; exgcd(a,n,d,x,y); if(b%d) ret

excrt(拓展中国剩余定理)

对于一个同余方程 对于第一个和第二个式子 则有: ans=a1?+k1?∗n1? ans=a2?+k2?∗n2? 就有: a1?+k1?∗n1?=a2?+k2?∗n2? k1?∗n1?−k2?∗n2?=a2?−a1? 故我们设c=a2?−a1? 再变化一下形式就有: k1?∗n1?+(−k2?)∗n2?=c 令 gcd=gcd(n1?,n2?) 这样我们就可以通过exgcd来求出一组解x1?,y1? 满足 x1?∗n1?+y2?∗n2?=gcd 故:x1?∗d/g∗n1?+y2?∗d/g∗n2?

LUOGU P4777 【模板】扩展中国剩余定理(EXCRT)

传送门 解题思路 扩展 $crt?$,就是中国剩余定理在模数不互质的情况下,首先对于方程 ?     $\begin{cases} x\equiv a_1\mod m_1\\x\equiv a_2\mod m_2\end{cases}$ 来说,可以将其写为: $\begin{cases} x=k_1*m_1+a_1\\x=k_2*m_2+a_2\end{cases}$ 然后联立方程: ?     $k_1*m_1+a_1=k_2*m_2+a_2$ $\Leftrightarrow -k_1*m_

【CRT】中国剩余定理简介

中国剩余定理(CRT) 中国剩余定理出自中国的某本古书,似乎是孙子兵法?(雾 其中有这样一个问题: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 即,对于这样一个方程组: \[ \begin{cases}x\equiv a_1\pmod{m_1}\\x\equiv a_2\pmod{m_2}\\x\equiv a_3\pmod{m_3}\\\dots\\x\equiv a_i\pmod{m_i}\end{cases} \] 我们已知所有\(a_i,m_i\),求可行解\(x

中国剩余定理及其拓展

中国剩余定理及其拓展 中国剩余定理CRT引例:(选自孙子兵法) 今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何? 怎么考虑这个问题? 按照题意: 设答案为x,则有 x≡2(mod 3) x≡3(mod 5) x≡2(mod 7) 就是求x的最小值 不难发现线性同余方程组的定义就是形如: x≡a1(mod m1) x≡a2(mod m2) x≡a3(mod m3) …………………………. x≡ak(mod mk) 的方程 Sol: 先看看解法:我们再来想想为什么是正确的. l 

中国剩余定理学习笔记

先看一道poj上的题目:[poj1006] Biorhythms 题意: 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期.然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现. 分析: 首先我们要知道,任意两个峰值之间一定相距整数倍的周期.假设一年的第N天达到峰值,则下次达到峰值