题目1 : 数论六·模线性方程组

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Ho:今天我听到一个挺有意思的故事!

小Hi:什么故事啊?

小Ho:说秦末,刘邦的将军韩信带领1500名士兵经历了一场战斗,战死四百余人。韩信为了清点人数让士兵站成三人一排,多出来两人;站成五人一排,多出来四人;站成七人一排,多出来六人。韩信立刻就知道了剩余人数为1049人。

小Hi:韩信点兵嘛,这个故事很有名的。

小Ho:我觉得这里面一定有什么巧妙的计算方法!不然韩信不可能这么快计算出来。

小Hi:那我们不妨将这个故事的数学模型提取出来看看?

小Ho:好!

<小Ho稍微思考了一下>

小Ho:韩信是为了计算的是士兵的人数,那么我们设这个人数为x。三人成排,五人成排,七人成排,即x mod 3, x mod 5, x mod 7。也就是说我们可以列出一组方程:

  1. x mod 3 = 2
  2. x mod 5 = 4
  3. x mod 7 = 6

韩信就是根据这个方程组,解出了x的值。

小Hi:嗯,就是这样!我们将这个方程组推广到一般形式:给定了n组除数m[i]和余数r[i],通过这n组(m[i],r[i])求解一个x,使得x mod m[i] = r[i]。

小Ho:我怎么感觉这个方程组有固定的解法?

小Hi:这个方程组被称为模线性方程组。它确实有固定的解决方法。不过在我告诉你解法之前,你不如先自己想想怎么求解如何?

小Ho:好啊,让我先试试啊!

提示:模线性方程组

输入

第1行:1个正整数, N,2≤N≤1,000。

第2..N+1行:2个正整数, 第i+1行表示第i组m,r,2≤m≤20,000,000,0≤r<m。

计算过程中尽量使用64位整型。

输出

第1行:1个整数,表示满足要求的最小X,若无解输出-1。答案范围在64位整型内。

样例输入
  1. 3
  2. 3 2
  3. 5 3
  4. 7 2
样例输出
  1. 23
    裸的中国剩余定理,数据比较强,原来写的过不了,估计相乘爆了64
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<string>
  5. #include<queue>
  6. #include<algorithm>
  7. #include<stack>
  8. #include<cstring>
  9. #include<vector>
  10. #include<list>
  11. #include<set>
  12. #include<map>
  13. using namespace std;
  14. #define ll long long
  15. #define mod 1000000007
  16. #define inf 999999999
  17. //#pragma comment(linker, "/STACK:102400000,102400000")
  18. int scan()
  19. {
  20. int res = , ch ;
  21. while( !( ( ch = getchar() ) >= '' && ch <= '' ) )
  22. {
  23. if( ch == EOF ) return << ;
  24. }
  25. res = ch - '' ;
  26. while( ( ch = getchar() ) >= '' && ch <= '' )
  27. res = res * + ( ch - '' ) ;
  28. return res ;
  29. }
  30. ll a[];
  31. ll b[];
  32. ll gcd(ll x,ll y)
  33. {
  34. if(y==)
  35. return x;
  36. else
  37. return gcd(y,x%y);
  38. }
  39. void exgcd(ll a, ll b, ll &x, ll &y)
  40. {
  41. if(b == )
  42. {
  43. x = ;
  44. y = ;
  45. return;
  46. }
  47. exgcd(b, a % b, x, y);
  48. ll tmp = x;
  49. x = y;
  50. y = tmp - (a / b) * y;
  51. }
  52. int main()
  53. {
  54. ll x,y,z,i,t;
  55. while(scanf("%lld",&z)!=EOF)
  56. {
  57. for(i=;i<z;i++)
  58. scanf("%lld%lld",&b[i],&a[i]);
  59. ll a1=a[],b1=b[];
  60. ll jie=;
  61. for(i=;i<z;i++)
  62. {
  63. ll a2=a[i],b2=b[i];
  64. ll xx,yy;
  65. ll gys=gcd(b1,b2);
  66. if((a2-a1)%gys)
  67. {
  68. jie=;
  69. break;
  70. }
  71. exgcd(b1/gys,b2/gys,xx,yy);
  72. xx = ((a2-a1)/gys*xx)%(b[i]/gys);//这句是关键
  73. a1= a1+xx*b1;
  74. b1 = b1/gys*b[i];
  75. a1 =((a1%b1)+b1)%b1;
  76. }
  77. if(!jie)
  78. printf("-1\n");
  79. else
  80. printf("%lld\n",a1);
  81. }
  82. return ;
  83. }

hihocode 九十七周 中国剩余定理的更多相关文章

  1. 《孙子算经》之"物不知数"题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

  2. POJ 1006 中国剩余定理

    #include <cstdio> int main() { // freopen("in.txt","r",stdin); ; while(sca ...

  3. [TCO 2012 Round 3A Level3] CowsMooing (数论,中国剩余定理,同余方程)

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=12083 这道题还是挺耐想的(至少对我来说是这样).开始时我只会60 ...

  4. poj1006中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103506   Accepted: 31995 Des ...

  5. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

  6. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  7. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

  8. POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...

  9. hdu 3579 Hello Kiki 不互质的中国剩余定理

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

随机推荐

  1. qsv转换为mp4

    1:下载  装换工具:http://www.downza.cn/soft/27484.html 2:双击打开exe可执行程序. 3:添加要转换的文件,和转换后要存储的位置 4:开始转换,转换为flv格 ...

  2. iOS学习之VFL语言简介

    什么是VFL语言 VFL(Visual Format Language),“可视化格式语言”. VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelBut ...

  3. Mysql查询一个表的所有字段名

    select COLUMN_NAME from information_schema.`COLUMNS`        -- 这行不变,照抄 where TABLE_SCHEMA = 'xerp'   ...

  4. Java事件监听的四种实现方式

    1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...

  5. no-siteapp 和 no-transform

    简单的说,是禁止转码 . 举个通俗的例子. 你建了一栋房子(网站),百度说我给你做个大门,但是大门上要有我的广告 你不愿意,就建立了一条路叫no-transform 别人去你家走这条路就行了 后来百度 ...

  6. EditPlus 4.3.2502 中文版已经发布(12月5日更新)

    新的版本修复了在之前某版本中键盘 End 键定位位置错误的问题.

  7. 20154312 曾林 Exp3 免杀原理与实践

    20154312 曾林 0.写在前面 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找到,也就是 ...

  8. Q-learning简明实例

    本文是对 http://mnemstudio.org/path-finding-q-learning-tutorial.htm 的翻译,共分两部分,第一部分为中文翻译,第二部分为英文原文.翻译时为方便 ...

  9. linux常用命令:less 命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  10. Socket和ServletSocket的交互

    ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket. Socket(InetAddress addre ...