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 ...
随机推荐
- SQL 学习笔记
1.判断数据库中某个值是否为null(而不是'null',空字符串'',若干个空格' ') 一定不能用=null 或 !=null,而要用is null 或 is not null. 2.在sqlse ...
- [代码] 类似 YYText 将表情文本转换成表情字符
一,经历 1> 由于工作需要,得把 UITextView 中的属性文本转换成普通文字,并将处理后的普通文字转换成属性文本. 2> 将属性文本转换成普通文字简单,可以调用属性文本的enume ...
- marquee滚动语法
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- GitLab安装手记
阿里云1G内存20G硬盘 1.首先下载GitLab Deb包(官网附有apt-get安装方式,但国内环境貌似不成功): https://about.gitlab.com/downloads/ 2. d ...
- bootstrap学习笔记之二
学习表单时还是有些吃力的,主要感觉有些结构有些复杂,没有自己亲手去操作就感觉似懂非懂,所以还得自己亲手测一下. 现在开始按钮的学习. 可作为按钮使用的标签和元素有: <a>.<bu ...
- 定位position
position : absolute | relative | fixed | static 定位:子集可以超出父级的范围,如父级蛇overflow:hidden则看不到. absolute : 绝 ...
- 将文件系统数据库迁移到ASM中
使用裸设备配置ASM实例 http://www.cnblogs.com/myrunning/p/4270849.html 1.查看我们创建的磁盘组 [oracle@std ~]$ export ORA ...
- include文件时尽量使用绝对路径
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id'] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用ech ...
- Android课程---Activity 的生命周期
activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...
- javaweb--HTTP状态码
HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...