POJ 2891 般模线性方程组
来源:互联网 发布:网络热销产品排行榜 编辑:程序博客网 时间:2024/05/16 09:11
题意:给出k个模方程组:x mod ai = ri。求x的最小正值。如果不存在这样的x,那么输出-1.
由于这道题目里面的ai、ri之间不满足两两互质的性质,所以不能用中国剩余定理直接求解。
X mod m1=r1
X mod m2=r2
...
...
...
X mod mn=rn
首先,我们看两个式子的情况
X mod m1=r1……………………………………………………………(1)
X mod m2=r2……………………………………………………………(2)
则有
X=m1*k1+r1………………………………………………………………(*)
X=m2*k2+r2
那么 m1*k1+r1=m2*k2+r2
整理,得
m1*k1-m2*k2=r2-r1
令(a,b,x,y,m)=(m1,m2,k1,k2,r2-r1),原式变成
ax+by=m
熟悉吧?
此时,因为GCD(a,b)=1不一定成立,GCD(a,b) | m 也就不一定成立。所以应该先判 若 GCD(a,b) | m 不成立,则!!!方程无解!!!。
否则,继续往下。
解出(x,y),将k1=x反代回(*),得到X。
于是X就是这两个方程的一个特解,通解就是 X'=X+k*LCM(m1,m2)
这个式子再一变形,得 X' mod LCM(m1,m2)=X
这个方程一出来,说明我们实现了(1)(2)两个方程的合并。
令 M=LCM(m1,m2),R=r2-r1
就可将合并后的方程记为 X mod M = R。
然后,扩展到n个方程。
用合并后的方程再来和其他的方程按这样的方式进行合并,最后就能只剩下一个方程 X mod M=R,其中 M=LCM(m1,m2,...,mn)。
那么,X便是原模线性方程组的一个特解,通解为 X'=X+k*M。
如果,要得到X的最小正整数解,就还是原来那个方法:
X%=M;
if (X<0) X+=M;
//poj 2891(一般模线性方程组)#include<iostream>#include<string>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<stack>#include<set>#include<cstdlib>using namespace std;#define LL long longconst int inf = 0x3f3f3f3f;const int maxn = 1e5 + 5;int n;LL m[maxn], r[maxn];void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y){ if (!b) {d = a, x = 1, y = 0;} else { ex_gcd(b, a % b, d, y, x); y -= x * (a / b); }}LL ex_crt(LL *m, LL *r, int n){ LL M = m[1], R = r[1], x, y, d; for (int i = 2; i <= n; ++i) { ex_gcd(M, m[i], d, x, y); //扩展欧几里得,d为M,m[i]的最大公约数 if ((r[i] - R) % d) return -1; //无解 x = (r[i] - R) / d * x % (m[i] / d); //满足条件的k的值 R += x * M; //满足前i个条件的x M = M / d * m[i]; //m的最小公倍数 R %= M; } return R > 0 ? R : R + M ;}int main(){ while (~scanf("%d",&n)) { for (int i = 1; i <= n; ++i) scanf("%lld%lld", &m[i], & r[i]); printf("%lld\n",ex_crt(m,r,n)); } return 0;}
- POJ 2891 般模线性方程组
- poj 2891 (一般模线性方程组)
- POJ 2891 模线性方程组(mi mj 不互素)
- poj 2891 Strange Way to Express Integers (解模线性方程组)
- POJ 2891 Strange Way to Express Integers 一般模线性方程组
- poj 2891 Strange Way to Express Integers(解一般模线性方程组)
- POJ 2891 Strange Way to Express Integers【模线性方程组】(中国剩余定理非互质套用)
- 模线性方程组
- 模线性方程组
- 模线性方程组
- 模线性方程组
- 模线性方程组
- 模线性方程组
- 模线性方程组
- poj 2065 SETI 【高斯消元 + 快速幂 解模线性方程组】
- poj 2947 Widget Factory (高斯消元法,解模线性方程组)
- hihoCoder 1303 模线性方程组
- 线性方程组
- 第十五周--知原理
- 第十一周项目1-(1)二叉树的层次遍历算法
- 淘宝网发起的Web服务器项目
- eclipse 中spring项目的xml配置打开方式里 找不到Namespaces
- 第十五周上机实践—项目2—用哈希法组织关键字
- POJ 2891 般模线性方程组
- 第十五周 项目三 B-树的基本操作
- 第16周项目4英文单词排序
- request.getParameter() 和request.getAttribute() 区别
- Android单点登录的模拟实现
- 第十周【项目1 - 二叉树算法库】
- bootstrap按钮
- Android 获取屏幕高宽度,密度,通知栏高度,截图等常用方法
- 第十一周项目一:验证算法(3)中序线索化二叉树二叉树的算法验证