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 non-negative m, divide it by every ai (1 ≤ i ≤ k) to find the remainder ri. If a1, a2, …, ak are properly chosen, m can be determined, then the pairs (ai, ri) can be used to express m.
“It is easy to calculate the pairs from m, ” said Elina. “But how can I find m from the pairs?”
Since Elina is new to programming, this problem is too difficult for her. Can you help her?
Input
The input contains multiple test cases. Each test cases consists of some lines.
- Line 1: Contains the integer k.
- Lines 2 ~ k + 1: Each contains a pair of integers ai, ri (1 ≤ i ≤ k).
Output
Output the non-negative integer m on a separate line for each test case. If there are multiple possible values, output the smallest one. If there are no possible values, output -1.
题目大意:给k个线性同余方程,求这些方程的公共解。
附思路:http://blog.csdn.net/orpinex/article/details/6972654
思路:考虑两个方程的情况
ans = r1(mod a1)
ans = r2(mod a2)①
存在k1使得ans = r1 + k1 * a1
把ans代入①得:r1 + k1 * a1 = r2(mod a2)
k1 * a1 = r2 - r1(mod a2)
存在k2使得k1 * a1 - k2 * a2 = r2 - r1
利用拓展欧几里得求出k1(为了得到最小的非负整数k1,可以让k1 = k1 mod (a2/gcd(a1, a2)))
那么令ans = r1 + k1 * a1
对于多个方程的情况,两个两个地联立解,new_r = ans = r1 + k1 * a1, new_a = lcm(a1, a2)
解析:
关于为了让k1最小要k1 = k1 mod (a2/gcd(a1, a2))。令d = gcd(a1, a2),a1'= a1 / d,a2' = a2 / d ,r' = (r2 - r1) / d,对方程k1 * a1 - k2 * a2 = r2 - r1,两边同时除以d得k1 * a1' - k2 * a2' = r',即k1 * a1' = r' (mod a2'),对于任意解k1 = x',有通解x = x' + a2' = x' + a2 / gcd(a1, a2)。则最小的k1 = (x' + a2 / gcd(a1, a2)) mod (a2 / gcd(a1, a2) = x' mod (a2 / gcd(a1, a2))
关于new_a = lcm(a1, a2)。考虑方程x * a = y * b,两边同时除以gcd(a, b),得到x * a' = y * b',x / y = b' / a',那么有x = kb',y = ka',k∈Z。那么使得方程x * a = y * b成立的x * a = k * b' * a = k * lcm(a, b)。容易想象,p + ax = q + by的每个合理的p + ax的差为lcm(a, b)。即对于方程r1(mod a1) = r2(mod a2)的解也是隔lcm(a1, a2)就出现一个解,即new_a = lcm(a1, a2)。
代码(16MS):
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL; void exgcd(LL a, LL b, LL &d, LL &x, LL &y) {
if(!b) d = a, x = , y = ;
else {
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
} int main() {
LL k, a1, a2, r1, r2;
while(scanf("%I64d", &k) != EOF) {
bool flag = true;
scanf("%I64d%I64d", &a1, &r1);
for(int i = ; i < k; ++i) {
scanf("%I64d%I64d", &a2, &r2);
if(!flag) continue;
LL r = r2 - r1, d, k1, k2;
exgcd(a1, a2, d, k1, k2);
if(r % d) flag = false;
LL t = a2 / d;
k1 = (r / d * k1 % t + t) % t;
r1 = r1 + a1 * k1;
a1 = a1 / d * a2;
}
printf("%I64d\n", flag ? r1 : -);
}
}
POJ 2891 Strange Way to Express Integers(拓展欧几里得)的更多相关文章
- poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9472 ...
- poj——2891 Strange Way to Express Integers
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 16839 ...
- [POJ 2891] Strange Way to Express Integers
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 10907 ...
- poj 2891 Strange Way to Express Integers(中国剩余定理)
http://poj.org/problem?id=2891 题意:求解一个数x使得 x%8 = 7,x%11 = 9; 若x存在,输出最小整数解.否则输出-1: ps: 思路:这不是简单的中国剩余定 ...
- POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd
http://poj.org/problem?id=2891 题意就是孙子算经里那个定理的基础描述不过换了数字和约束条件的个数…… https://blog.csdn.net/HownoneHe/ar ...
- POJ 2891 Strange Way to Express Integers 中国剩余定理MOD不互质数字方法
http://poj.org/problem?id=2891 711323 97935537 475421538 1090116118 2032082 120922929 951016541 1589 ...
- [poj 2891] Strange Way to Express Integers 解题报告(excrt扩展中国剩余定理)
题目链接:http://poj.org/problem?id=2891 题目大意: 求解同余方程组,不保证模数互质 题解: 扩展中国剩余定理板子题 #include<algorithm> ...
- POJ 2891 Strange Way to Express Integers【扩展欧几里德】【模线性方程组】
求解方程组 X%m1=r1 X%m2=r2 .... X%mn=rn 首先看下两个式子的情况 X%m1=r1 X%m2=r2 联立可得 m1*x+m2*y=r2-r1 用ex_gcd求得一个特解x' ...
- POJ 2891 Strange Way to Express Integers(中国剩余定理)
题目链接 虽然我不懂... #include <cstdio> #include <cstring> #include <map> #include <cma ...
随机推荐
- db2日常维护
一. DB2日常维护操作 1.数据库的启动.停止.激活 db2 list active databases db2 active db 数据库名 db2start --启动 db2stop [forc ...
- javascript 时间操作
javascript时间函数 javascript提供了Date对象来进行时间和日期的计算.Date对象有多种构造函数: 1.dateObj=new Date() //当前时间 2.dateObj=n ...
- About_datebase
1:创建数据库的名字 create database + 表名; 2:连接数据库 use + 表名; 3:删除数据库 drop database + 表名; 4:创建表 create table + ...
- POJ3903:Stock Exchange(LIS)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E 题目: Description The world ...
- [CareerCup] 15.5 Denormalization 逆规范化
15.5 What is denormalization? Explain the pros and cons. 逆规范化Denormalization是一种通过添加冗余数据的数据库优化技术,可以帮助 ...
- Introduction of Team Member
1. 姓名:xx 性别:男 出生日期:1993.04.16 班级:110616班 职务:小班长 爱好:唱歌.排球 2. 姓名:xxx 性别:男 出生日期:1993.4.20 3. 姓名:xxx 性别: ...
- 字典树(Trie Tree)
在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中. ...
- remove 清除binlog
#!/bin/bash DATACFG=/etc/my.cnf DATADIR=`awk /^datadir/ $DATACFG|awk -F"=" '{print $2}'` D ...
- Web前端开发基础 第四课(CSS一些性质)
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签 ...
- SVN 远程无法联通
远程花生壳搭建之后,配置在服务器iis上的其他的网站都能访问,局域网都可以,就是SVN远程连接不通. 没有搞过这样的问题,一下就不知道怎么办了.网上也没有人搞过,然后想到以前公司的一个大神搞过,然后请 ...