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 a1a2, …, ak. For some non-negative m, divide it by every ai (1 ≤ i ≤ k) to find the remainder ri. If a1a2, …, ak are properly chosen, m can be determined, then the pairs (airi) 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 airi (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(拓展欧几里得)的更多相关文章

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

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9472   ...

  2. poj——2891 Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 16839 ...

  3. [POJ 2891] Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 10907 ...

  4. poj 2891 Strange Way to Express Integers(中国剩余定理)

    http://poj.org/problem?id=2891 题意:求解一个数x使得 x%8 = 7,x%11 = 9; 若x存在,输出最小整数解.否则输出-1: ps: 思路:这不是简单的中国剩余定 ...

  5. POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd

    http://poj.org/problem?id=2891 题意就是孙子算经里那个定理的基础描述不过换了数字和约束条件的个数…… https://blog.csdn.net/HownoneHe/ar ...

  6. POJ 2891 Strange Way to Express Integers 中国剩余定理MOD不互质数字方法

    http://poj.org/problem?id=2891 711323 97935537 475421538 1090116118 2032082 120922929 951016541 1589 ...

  7. [poj 2891] Strange Way to Express Integers 解题报告(excrt扩展中国剩余定理)

    题目链接:http://poj.org/problem?id=2891 题目大意: 求解同余方程组,不保证模数互质 题解: 扩展中国剩余定理板子题 #include<algorithm> ...

  8. 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' ...

  9. POJ 2891 Strange Way to Express Integers(中国剩余定理)

    题目链接 虽然我不懂... #include <cstdio> #include <cstring> #include <map> #include <cma ...

随机推荐

  1. vue.js中v-for的使用及索引获取

    1.v-for 直接上代码. 示例一: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  2. HDU-2084 数塔 经典dp,水

    1.HDU-2084   数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为  dp[i][j] ...

  3. iOS 评论APP撰写评论

    ---- iOS 应用评分 UIAlertAction *alertAction1 = [UIAlertAction actionWithTitle:@"方式1 跳转到app商店" ...

  4. FPGA的典型应用领域

    本文关键字:fpga应用,fpga应用领域, fpga培训,FPGA应用开发入门与典型实例 一.数据采集和接口逻辑领域 1.FPGA在数据采集领域的应用 由于自然界的信号大部分是模拟信号,因此一般的信 ...

  5. mysql5.7.11修改root默认密码

    知道 MySQL 出了5.7了,并且网上说性能提高了一两倍,于是在虚拟机上安装了个 CentOS 7,在上面安装 MySQL 5.7 我使用的是 yum安装方式,要求虚拟机能够上网,因为它会在线下载安 ...

  6. [慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时

    案例梳理时间:2013-9-25 写在前面的话: 在慢查优化1和2里都反复强调过 explain 的重要性,但有时候肉眼看不出 explain 结果如何指导优化,这时候还需要有一些其他基础知识的佐助, ...

  7. java之redis篇(spring-data-redis整合一)

    redis的知识:官网 1.利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/PO ...

  8. gerrit使用教程

      注:使用时把“user”替换为自己的账号,例如 ueapp: ssh://huang.fei@10.0.64.16:29418/jonet2_0_app_ueapp.git 新的环境下需要先注册g ...

  9. 简单的自定义Adapter

    import android.content.Context; import android.view.LayoutInflater; import android.view.View; import ...

  10. PCTUSED和PCTFREE对数据操作的影响

    1概念理解 首先PCTUSED和PCTFREE都是针对数据块的存储属性,单位都是%.其中PCTFREE决定了数据块什么时候从free list中移除,系统就不可以再往该数据块中插入数据,对于数据块中已 ...