中国剩余定理小结 (互质,非互质) (poj 1006,hdu 3579)

先证明下中国剩余定理

条件:

x%m_1=a_1

x%m_2=a_2

...

x%m_n=a_n

m_1,m_2,...,m_n两两互质

证明:

设M=m_1*m_2*m_3*...*m_n

M_i=M/m_i

因为gcd(M_i,m_i)=1,所以M_ix+m_iy=1

(t_i*M_i)%m_i=1 //由Ext_gcd(M_i,m_i,x,y)求出,t_i=x

方程组的解:x=a_1*t_1*M_1+...+a_n*t_n*M_n

题目:poj 1006

http://poj.org/problem?id=1006

题意:

现在有三条式子:

x%23=a1

x%28=a2

x%33=a3

现在求最小的整数(x-d)

限制:

0 <= d <= 365

C++ Code


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63


/*poj 1006

题意:

现在有三条式子:

x%23=a1

x%28=a2

x%33=a3

现在求最小的整数(x-d)

限制:

0 <= d <= 365

思路:

中国剩余定理

条件:

x%m_1=a_1

x%m_2=a_2

...

x%m_n=a_n

m_1,m_2,...,m_n两两互质

证明:

设M=m_1*m_2*m_3*...*m_n

M_i=M/m_i

因为gcd(M_i,m_i)=1,所以M_ix+m_iy=1

(t_i*M_i)%m_i=1   //由Ext_gcd(M_i,m_i,x,y)求出,t_i=x

方程组的解:x=a_1*t_1*M_1+...+a_n*t_n*M_n

*/

#include<iostream>

#include<cstdio>

using namespace std;

#define LL __int64

LL Ext_gcd(LL a,LL b,LL &x,LL &y){

if(b==0) { x=1, y=0; return a; }

LL ret=Ext_gcd(b,a%b,y,x);

y-=a/b*x;

return ret;

}

LL CRT(LL a[],LL m[],int n){

LL M=1;

for(int i=0;i<n;++i) M*=m[i];

LL ret=0;

for(int i=0;i<n;++i){

LL x,y;

LL tm=M/m[i];

Ext_gcd(tm,m[i],x,y);

ret=(ret+tm*x*a[i])%M;

}

return (ret+M)%M;

}

int main(){

LL a[3],m[3],d;

m[0]=23,m[1]=28,m[2]=33;

LL M=m[0]*m[1]*m[2];

int cas=0;

while(scanf("%I64d%I64d%I64d%I64d",&a[0],&a[1],&a[2],&d)){

if(a[0]==-1 && a[1]==-1 && a[2]==-1 && d==-1) break;

LL ans;

ans=CRT(a,m,3)-d;

if(ans==0) ans=M;

else ans=(ans+M)%M;

printf("Case %d: the next triple peak occurs in %I64d days.\n",++cas,ans);

}

return 0;

}

在说下非互质情况下的中国剩余定理

证明如下:

由于不两两互质,所以只能两个两个解。

设通解为N

->N=m1*k1+r1,N=m2*k2+r2

->m1*k1+r1=m2*k2+r2

->k1*m1+(-k2*m2)=r2-r1

->设a=m1,b=m2,x=k1,y=(-k2),c=r2-r1

->ax+by=c 通过 d=Ext_gcd(a,b,x,y) 得 d,x

->最小整数解x=(x*(c/d)%(b/d)+(b/d))%(b/d)

->N=a*(x+n*(b/d))+r1

->N=(a*b/d)*n+(a*x+r1)

->令m3=a*b/d,r3=a*x+r1,k3=n

->N=m3*k3+r3 化成了一个新的式子,不断迭代然后出结果。

题目:hdu 3579

http://acm.hdu.edu.cn/showproblem.php?pid=3579

题意:

给出m_1,m_2,...m_n;a_1,a_2,...,a_n,非互质中国剩余定理。

C++ Code


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63


/*hdu 3579

题意:

给出m_1,m_2,...m_n;a_1,a_2,...,a_n,非互质中国剩余定理。

思路:

中国剩余定理

由于不两两互质,所以只能两个两个解。

设通解为N

->N=m1*k1+r1,N=m2*k2+r2

->m1*k1+r1=m2*k2+r2

->k1*m1+(-k2*m2)=r2-r1

->设a=m1,b=m2,x=k1,y=(-k2),c=r2-r1

->ax+by=c 通过 d=Ext_gcd(a,b,x,y) 得 d,x

->最小整数解x=(x*(c/d)%(b/d)+(b/d))%(b/d)

->N=a*(x+n*(b/d))+r1

->N=(a*b/d)*n+(a*x+r1)

->令m3=a*b/d,r3=a*x+r1,k3=n

->N=m3*k3+r3 化成了一个新的式子,不断迭代然后出结果。

*/

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

#define LL __int64

LL Ext_gcd(LL a,LL b,LL &x,LL &y){

if(b==0){ x=1,y=0; return a; }

LL ret=Ext_gcd(b,a%b,y,x);

y-=a/b*x;

return ret;

}

int n;

LL a[100005],m[100005];

LL CRT(){

LL M=m[0];

LL ret=a[0];

for(int i=1;i<n;++i){

LL x,y,d;

d=__gcd(M,m[i]);

if((a[i]-ret)%d) return -1; //注意无解时的返回值

Ext_gcd(M,m[i],x,y);

x=(a[i]-ret)/d*x%(m[i]/d);

ret+=x*M;

M=M/d*m[i];

ret%=M;

}

ret=(ret+M)%M;

return ret==0?M:ret;    //模除类问题要注意答案能不能为0

}

int main(){

int T;

int cas=0;

scanf("%d",&T);

while(T--){

scanf("%d",&n);

for(int i=0;i<n;++i)

scanf("%I64d",&m[i]);

for(int i=0;i<n;++i)

scanf("%I64d",&a[i]);

printf("Case %d: %I64d\n",++cas,CRT());

}

return 0;

}

时间: 2024-10-08 16:29:22

中国剩余定理小结 (互质,非互质) (poj 1006,hdu 3579)的相关文章

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

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

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

题目链接: 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×1

BestCoder Round #80 1004 hdu 5668 中国剩余定理(m不互质版)

链接:戳这里 Circle Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others) 问题描述 \ \ \ \     Fye对约瑟夫游戏十分着迷. \ \ \ \     她找到了n个同学,把他们围成一个圈,让他们做约瑟夫游戏,然后她得到了一个同学们出圈的编号序列.游戏是这样进行的:以同学1为起点,开始计数,计数到第k个同学,该同学出圈.出圈的同学将不参与之后的计数. \ \ \ \  

中国剩余定理学习笔记

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

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k. 则同余方程组: x = a1 (mod n1) x = a2 (mod n2) ... x = ak (mod nk) 模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意义下,存在唯一的x,满足: x = ai mod [n1,n2,...,nk], i=1,2,3,...,k. 解可以写为这种形式: x = sigma(ai* 

POJ 2891 中国剩余定理的非互质形式

中国剩余定理的非互质形式 任意n个表达式一对对处理,故只需处理两个表达式. x = a(mod m) x = b(mod n) km+a = b (mod n) km = (a-b)(mod n) 利用扩展欧几里得算法求出k k = k0(mod n/(n,m)) = k0 + h*n/(n,m) x = km+a = k0*m+a+h*n*m/(n,m) = k0*m+a (mod n*m/(n,m)) #include <cstdio> #include <cstring> #

hdu 1573 X问题 (非互质的中国剩余定理)

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2980    Accepted Submission(s): 942 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod

poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)

Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9472   Accepted: 2873 Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is

Chinese remainder theorem again(中国剩余定理+不互质版+hud1788)

Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1788 Appoint description:  System Crawler  (2015-04-27) Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,m