题意:Elina看一本刘汝佳的书(O_O*),里面介绍了一种奇怪的方法表示一个非负整数 m 。也就是有 k 对 ( ai , ri ) 可以这样表示——m%ai=ri。问 m 的最小值。

解法:拓展欧几里德求解同余方程组的最小非负整数解。(感觉挺不容易的......+_+@)

先看前2个关系式:                       m%a1=r1 和 m%a2=r2 
                                                            m-a1*x=r1 和 m-a2*y=r2 →
                                                            m=a1*x+r1 和 m=a2*y+r2
                                                            a1*x-a2*y=r2-r1
       于是用拓展欧几里德求得一个满足这2个关系式/方程联立的最小非负整数解 (x',y')。
  那么存在一个:                                  m'-a1*x'=r1 和 m'-a2*y'=r2 
                                                            m'=a1*x'+r1=a2*y'+r2
                                                            m' %a1=m%a1 和 m' %a2=m%a2 
                                                            m' %lcm(a1,a2)=m%lcm(a1,a2)
                                                            m=m'+k*lcm(a1,a2)
                                                            m=(a1*x'+r1)+lcm(a1,a2)*k
                                                            m=      r'       +         a'    *x
                                                           
......
                                                           
m=ak*y'+rk+lcm(ak-1,ak)*k
                                                  而又   m=ak*y'+rk , r'=ak*y'+rk
                                                  所以   m=r'
       接着继续将这个式子与  m=a3*y+r3 联立,同样地得到一个新的方程,再一直继续联立下去,由于 x 保证了尽量下,最后的 r' 就是尽量小的答案。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6 typedef long long LL;
7
8 LL mabs(LL x) {return x>0?x:-x;}
9 LL exgcd(LL a,LL b,LL& x,LL& y)
10 {
11 if (!b) {x=1,y=0; return a;}
12 LL d,tx,ty;
13 d=exgcd(b,a%b,tx,ty);
14 x=ty,y=tx-(a/b)*ty;
15 return d;
16 }
17 int main()
18 {
19 LL k;
20 while (scanf("%I64d",&k)!=EOF)
21 {
22 LL aa,rr,a,r; bool ok=false;
23 for (LL i=1;i<=k;i++)
24 {
25 scanf("%I64d%I64d",&aa,&rr);
26 if (ok) continue;
27 if (i==1) a=aa,r=rr;
28 else
29 {//求解同余方程
30 LL d,x,y,t;
31 d=exgcd(a,aa,x,y);//ax-aay=rr-r 有无正负号没有关系
32 if ((rr-r)%d!=0) {ok=true;continue;}//break;} 多组数据要读入完!
33 x=x*((rr-r)/d);//1个解
34 t=mabs(aa/d);//mabs
35 x=(x%t+t)%t;//最小非负整数解
36
37 r=a*x+r,a=a*aa/d;//a=lcm(a,aa)=a*aa/gcd(a,aa)=a*aa/d;
38 }
39 }
40 if (!ok) printf("%I64d\n",r);
41 else printf("-1\n");
42 }
43 return 0;
44 }

【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)的更多相关文章

  1. POJ 2891 Strange Way to Express Integers(拓展欧几里得)

    Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...

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

  3. 【poj 1061】青蛙的约会(数论--拓展欧几里德 求解同余方程)

    题意:已知2只青蛙的起始位置 a,b 和跳跃一次的距离 m,n,现在它们沿着一条长度为 l 的纬线(圈)向相同方向跳跃.问它们何时能相遇?(好有聊的青蛙 (΄◞ิ౪◟ิ‵) *)永不相遇就输出&quo ...

  4. 【hdu 3579】Hello Kiki(数论--拓展欧几里德 求解同余方程组)

    题意:Kiki 有 X 个硬币,已知 N 组这样的信息:X%x=Ai , X/x=Mi (x未知).问满足这些条件的最小的硬币数,也就是最小的正整数 X. 解法:转化一下题意就是 拓展欧几里德求解同余 ...

  5. 【hdu 1573】X问题(数论--拓展欧几里德 求解同余方程组的个数)

    题目:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i] ...

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

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

  7. poj——2891 Strange Way to Express Integers

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

  8. [POJ 2891] Strange Way to Express Integers

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

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

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

随机推荐

  1. 解决surfacebook无法运行64位虚拟机的问题

    如果您嫌烦请直接看英文部分解决方案,另外windows专业版内置的hyper-v也是一款及其好用的虚拟机. 网上各种方案都尝试过,但是每次使用VMware创建64为虚拟机的时候总会显示不支持64位虚拟 ...

  2. 【剑指 Offer】07.重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 示例: 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ...

  3. LeetCode278 第一个错误的版本

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  4. C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻

    这是道哥的第014篇原创 目录 一.前言 二.变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 5.1 指针变量自身的值 5.2 获取指针变量 ...

  5. git 遇到 fatal: loose object xxxx (stored in .git/objects/cb/xxxx) is corrupt 问题

    我的git版本是2.3.x,用下面这个参考链接的方法也可以解决 参考blog

  6. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  7. 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)

    声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...

  8. 【MySQL】Last_SQL_Errno: 1594Relay log read failure: Could not parse relay log event entry...问题总结处理

    备库报错: Last_SQL_Errno: 1594 Last_SQL_Error: Relay log read failure: Could not parse relay log event e ...

  9. LR参数

    一.LR函数 : lr_start_transaction:   为性能分析标记事务的开始 lr_end_transaction: 为性能分析标记事务的结束:事务名称与事务开始时保持一致 lr_ren ...

  10. 基础练习(上) - 蓝桥杯(Python实现)

    闰年判断: 题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍数 ...