poj.org/problem?id=2891 (题目链接)

题意:求解线性同余方程组,不保证模数一定两两互质。

Solotion

  用exgcd将俩个同余方程合并成一个
  
  如合并n%M=R,n%m=r
  
  即M*x+R=m*y+r
  
  M*x-m*y=r-R
  
  设a=M/t,b=m/t,c=(r-R)/t,t=gcd(a,b)
  
  若(r-R)%t!=0则无解
  
  用exgcd得到a*x+b*y=c的解x0,
  
  通解x=x0+k*b,k为整数
  
  带入M*x+R=n
  
  M*b*k+M*x0+R=n
  
  所以R=R+M*x0,M=M*b
  

  蒯自hzwer。
  注意当最后发现方程无解直接退出时,会导致有数据没有读完,然后就会Re,所以现用数组将所有数据存下来。

代码:

// poj2891
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi 3.1415926535898
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;const int maxn=100010;
LL mm[maxn],rr[maxn],n;LL gcd(LL a,LL b) {return a%b==0 ? b : gcd(b,a%b);
}
void exgcd(LL a,LL b,LL &x,LL &y) {if (!b) {x=1,y=0;return;}exgcd(b,a%b,y,x);y-=x*(a/b);   //注意此处a/b一定要到打括号,因为取的是a/b的整数部分
}
int main() {while (scanf("%lld",&n)!=EOF) {LL M,R,flag=1;scanf("%lld%lld",&M,&R);for (int i=1;i<n;i++) scanf("%lld%lld",&mm[i],&rr[i]);for (int i=1;i<n;i++) {LL m,r,x,y;m=mm[i],r=rr[i];LL d=gcd(M,m);if ((r-R)%d!=0) {printf("-1\n");flag=0;break;}exgcd(M/d,m/d,x,y);   //x*(M/d)+y*(m/d)=d,解出x,yx=((r-R)/d*x%(m/d)+(m/d))%(m/d);   //求出最小xR+=M*x;M*=m/d;   //lcm(M,m)}if (flag) printf("%lld\n",R);}return 0;
}

【poj2891】 Strange Way to Express Integers相关推荐

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

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

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

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

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

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

  4. [POJ2891] Strange Way to Express Integers

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

  5. 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 ...

  6. POJ2891 Strange Way to Express Integers (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...

  7. POJ2891 Strange Way to Express Integers

    线性同余方程 题目传送门 解线性同余方程的简单应用,注意要把数据读完再输出-1. 代码: #include<cstdio> #include<cstring> #include ...

  8. POJ2891——Strange Way to Express Integers(一元线性同余方程组)

    由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组. 求解 我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现. 对于同于方程组的求解,其实质过程就是对于其中的同余 ...

  9. 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, ...

最新文章

  1. 【oracle笔记3】多表查询
  2. android 锁屏应用,创建一个Android锁屏应用。
  3. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(61)-如何使用框架来开发?...
  4. 主数据管理(MDM)的七个最佳实践
  5. java 编码与基础数据类型
  6. C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
  7. 项目中使用粘性布局不起作用_项目中的 Git 使用规范
  8. 十四、PyCharm开发Python利用WMI修改电脑IP、DNS
  9. HTML+CSS+JS实现 ❤️canvas 3D云动画效果❤️
  10. STL 算法罗列 (转)
  11. matlab调和均值滤波_MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数...
  12. 基于Matlab的SLIC超像素分割算法分析
  13. Ubuntu下的几种常见输入法
  14. session 失效 java.lang.IllegalStateException异常产生的原因及解决办法
  15. 积分,积分兑换,英语怎么说?
  16. 解决:ARouter 报错 There is no route matched
  17. 理解SPI/Dual SPI/Quad SPI/QPI之间的区别
  18. 用STM32F103C8芯片做流水灯
  19. Mint家族迎来了“瑟瑞娜”
  20. [墨者学院] Windows硬盘文件分析取证(新建的用户名)

热门文章

  1. matrix67大神
  2. 数字孪生技术如何打造新型智慧城市管理体系概述
  3. VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程
  4. 用Python制作七夕表白神器,让你成功概率提高99.9%
  5. java小车赛跑_Java模拟赛跑过程
  6. php mhash,PHP加密扩展库-Mhash扩展库实例用法详解
  7. 本地镜像运行Docker容器Unable to find image 'hello-world:latest' locally docker: Error response from daemon
  8. CentOS minimal
  9. plex实现流媒体服务器_Plex是我一直在等待的媒体中心软件生态系统
  10. GitHub上这款网络排查工具,堪称神器!