题意: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 }

转载于:https://www.cnblogs.com/konjak/p/6063351.html

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

  1. 数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

    虽然作业还没有做完,但是我还是放不下它,对此,我只想说: 今天你对作业爱理不理,明天它就让你补到飞起 DP先放放,我们要雨露均沾 练习上手:乘法逆元 题目 题解 代码实现 曹冲养猪?(互质的中国剩余定 ...

  2. poj 2891 Strange Way to Express Integers 2012-09-05

    http://poj.org/problem?id=2891 解线性模方程组. 比较坑爹,数据比较大,很容易溢出. 1 Program poj2891; 2 3 var m:int64; 4 5 a, ...

  3. poj 2891 Strange Way to Express Integers

    题目:http://poj.org/problem?id=2891 思路:扩展欧几里得 #include <cstdio> #include <cstring> #includ ...

  4. POJ 2891 Strange Way to Express Integers ★ (扩展欧几里德解同余式组)

    题目链接:http://poj.org/problem?id=2891 题目大意: 很好的一道题,解同余式组: x = r1 (mod m1) x = r2 (mod m2) -- x = rp (m ...

  5. [POJ 2891] Strange Way to Express Integers

    Description 给定 k 个同余方程组,求出满足条件的最小正整数 x,或者无解输出 -1. Solution 注意到模数不一定互质,所以中国剩余定理不能用 嗯有请扩展中国剩余定理 定理证明就不 ...

  6. 【poj2891】 Strange Way to Express Integers

    poj.org/problem?id=2891 (题目链接) 题意:求解线性同余方程组,不保证模数一定两两互质. Solotion 用exgcd将俩个同余方程合并成一个 如合并n%M=R,n%m=r ...

  7. [POJ2891] Strange Way to Express Integers

    题目描述 FJ正在读佳佳写的一本书,书中描述一种表示非负整数的方法:选择k个不同的正整数a1,a2,-,ak,对于某个整数m分别对ai求余对应整数ri,如果适当选择a1,a2,-,ak,那么整数m可由 ...

  8. POJ2891 Strange Way to Express Integers【扩展中国剩余定理】

    题目大意 就是模板...没啥好说的 思路 因为模数不互质,所以直接中国剩余定理肯定是不对的 然后就考虑怎么合并两个同余方程 \(ans = a_1 + x_1 * m_1 = a_2 + x_2 * ...

  9. poj-2891(Strange Way to Express Integers)--中国剩余定理扩展欧几里得

    题意:找到一个m,使得m%ai=ri,并且这个m最小 m = a1*x + r1; m = a2*y + r2; 可得:a1*x - a2*y = r2 - r1 可得:a1*x ≡ r2-r1(mo ...

最新文章

  1. 封闭已久的智能驾驶系统,在云栖大会上,被敲开一个裂缝
  2. 检查是否有负循环(Bellman Ford, Floyd-Warshall)
  3. 【Efficient-Net】基于Efficient-Net效滤网的目标识别算法的MATLAB仿真
  4. SpringBoot(二)——实现一个基本的小网站
  5. TIME_WAIT简介
  6. 【城市沙龙】LiveVideoStack Meet|南京:互联网沙漠的音视频发展
  7. idea中运行maven安装jar包到本地仓库跳过test
  8. leetcode题目:第 k 个数
  9. avs v7.0 php,AVS v7.0 – PHP在线视频上传分享程序
  10. 微波接力通信、卫星通信、无线移动通信
  11. 郑州大学linux试题,郑州大学Linux讲义 PPT
  12. SEO搜索引擎优化二十八条经验建议
  13. 三类医疗器械ERP系统软件排行榜
  14. ffmpeg推流和拉流rtsp
  15. sis 最新_传统SIS系统面临考验——“可持续的安全仪表系统”来袭
  16. ecshop 模版写php,ecshop 模板直接使用运算符
  17. 0.1+0.2 等于 0.3 吗?(数字相加结果有无限小数的原因及解决方式)
  18. 【BZOJ 4399】魔法少女LJJ
  19. mc 手游无限挑战服务器,新版本的诱惑 弹弹堂手游无限挑战你敢来吗
  20. HCCG-CycleGAN网络结构、原理、以及相关代码--Generating Handwritten Chinese Characters using CycleGAN

热门文章

  1. python类的构造函数是_python类(class)的构造函数、初始化函数、析构函数
  2. java android 服务器_Android/Java从服务器端下载图片
  3. linux基础实验报告6,Linux实验报告6参考答案.doc
  4. java long 二进制输出格式_算法:java打印int类型的二进制格式
  5. kvm虚拟机设置万兆网卡_kvm已经设置桥接网卡的虚拟机无法连接宿主机?
  6. dll domodal运行时异常_解决装备疑难,计算机丢失***.dll文件方法「设计画圈」
  7. 理解JavaScript中的多态
  8. .net ef 字段不区分大小写_第六节:框架搭建之EF的Fluent Api模式的使用流程
  9. mysql udf http,mysql下mysql-udf-http效率测试小记
  10. html代码格式化nodejs,使用Node编写的Sublime代码格式化工具插件(HTML/CSS/JS)