中国剩余定理(模板+代码)
2016-10-06 16:47
260 查看
#include<stdio.h> #include <iostream> using namespace std; //扩展欧几里得算法 int exgcd(int a,int b,int &x,int &y) { int d; if(b==0) { x=1;y=0; return a; } d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } //中国剩余定理 ,r[]存放余数 ,prime[]存放两两互质的数 int Chinese_Remainder(int r[],int prime[],int len) { int i,d,x,y,m,n=1,sum=0; //计算所以除数的积n,也是所以除数的最小公倍数 for(i=0;i<len;i++) n*=prime[i]; //计算符合所以条件的数 for(i=0;i<len;i++) { m=n/prime[i];//计算除去本身的所有除数的积m d=exgcd(prime[i],m,x,y);//计算w[i]*x+m*y=gcd(w[i],m)的一个解y //累加整数解y的同并不断对n取余,其利用公式:(a+b)%c=(a%c+b%c)%c sum=(sum+y*m*r[i])%n; } return (n+sum%n)%n;//满足所以方程的最小解 } int main() { int n,i; int prime[15],r[15]; while (printf("请输入组数n:\n"),scanf("%d",&n)!=EOF) { printf("请依次输入每组的除数和余数:\n"); for (i=0;i<n;i++) { scanf("%d%d",&prime[i],&r[i]); } //printf("%d\n",Chinese_Remainder(b,w,n)); printf("符合条件的最小整数:%d\n\n",Chinese_Remainder(r,prime,n)); } return 0; }
核心代码:
int Chinese_Remainder(int r[],int prime[],int len) { int i,d,x,y,m,n=1,sum=0; for(i=0;i<len;i++) n*=prime[i]; for(i=0;i<len;i++) { m=n/prime[i]; d=exgcd(prime[i],m,x,y); sum=(sum+y*m*r[i])%n; } return (n+sum%n)%n; }
相关文章推荐
- 中国剩余定理 模板
- hdu 3579 Hello Kiki 中国剩余定理(不互质形式)模板题
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- poj 1006中国剩余定理(模板题)
- 中国剩余定理模板(JZOJ 3093. 【NOIP2012模拟11.7】合唱队形)
- 中国剩余定理模板(1) 两两互质情况
- POJ 1006 Biorhythms(中国剩余定理 模板)
- 中国剩余定理概念及模板解释
- ACM_模板_中国剩余定理(互质与非互质)
- 模板——中国剩余定理
- 中国剩余定理模板
- 中国剩余定理的讲解 + 代码
- 【中国剩余定理模板】
- 中国剩余定理 模板
- 中国剩余定理模板
- hdu 1573 X问题 中国剩余定理(直接模板就OK了)
- 中国剩余定理模板(互质版和非互质版)
- 同余方程[组] 乘法模逆元 中国剩余定理【模板】
- POJ-1006 Biorhythms 【中国剩余定理模板】
- <《模板》扩展欧几里德--求二元一次方程-及中国剩余定理>