算法学习之模线性同余方程组(中国剩余定理+求解同余方程组) poj1006+hdu3579

中国剩余定理

中国剩余定理原文:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

解法:中国剩余定理描述的就是一元线性同余方程组(其中m1,m2,...,mn均互质)。


是整数m1,m2, ... ,mn的乘积,并设Mi是除了mi以外的n- 1个整数的乘积。

为Mi模mi的逆元,所以有

将(S)的通解形式为

(这个式子想了半天才明白是怎么来的:依次模m1,m2,...,mn,就形成了(S)方程组了,因为有下列两个方程)



在模M意义下,(S)有唯一解

(以上来自百度百科)

poj1006

题意:人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。现在给出三个日期对应于该天是体力、感情和智力的高峰。现在给你一个日期,求从这一天起过多少天三个高峰同时出现。

题解:中国剩余定理的运用,23,28和33两两互质。

代码(作为模板,复杂度O(n)):

#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include

#include
#include

#define debug cout<<"aaa"<


求解同余方程组

中国剩余定理就是在求解同余方程组,但是当除数两两不互质的情况。就不能用CRT的结论来解决。


还是这个方程组,现在取出其中两个方程:

             x≡a1(mod m1)

             x≡a2(mod m2)

转化为:

             x+m1*x1=a1

             x+m2*x2=a2

合并有:m1*x1+m2*x2=a1-a2

可以通过扩展欧几里德解出,若(a1-a2)%gcd(m1,m2)!=0,则无解

反之解出x1,带入x+m1*x1=a1,得到一个特解x0=a1-m1*x1。

通解x=x0+k*lcm(a1,a2),即x≡x0(mod lcm(a1,a2)。

这样一来两个方程就合并成一个了,将这n个方程全部合并就可以解出x了。

hdu3579

题意:同中国剩余定理原文(这里除数两两不互质)

代码(作为模板,复杂度O(n)):

#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include

#include
#include

#define debug cout<<"aaa"<

留个模板
写的可能不太清楚嘿~

你可能感兴趣的:(算法学习)